3

Я создал два набора данных.Использование нескольких параметров в SSRS из хранимой процедуры Возвраты Пусто

DataSet1 (из хранимой процедуры):

CREATE PROCEDURE [dbo].[usp_GetPerson](
@Category varchar(20)) 
AS 

BEGIN 
SELECT FirstName, LastName, Category     
FROM tblPerson 
WHERE (Category IN (@Category)) 

END 

Dataset2:

SELECT DISTINCT Category 
FROM tblPerson 

В SSRS, я редактировал параметр, чтобы разрешить несколько значений и тянуть доступных значений от Dataset2.

Я пробовал фильтровать только на основе Dataset1, но получаю все входы, которые повторяются (именно поэтому я решил использовать набор данных 2).

Когда я использую хранимую процедуру, я не могу выбрать несколько значений. Я могу выбрать только отдельные значения, иначе отчет будет пустым.

Итак, я воссоздал набор данных1, но не использовал хранимую процедуру. Вместо этого я просто написал инструкцию SQL в текстовом редакторе, и я могу просто выбрать несколько значений.

Кто-нибудь знает, почему это происходит и может помочь мне исправить это?

Примечание. Я использую хранимые процедуры, когда мои инструкции SQL становятся более сложными, когда я буду объединять несколько баз данных. Я попытался сделать это в SSRS, но это было намного быстрее, используя хранимые процедуры.

Спасибо!

+0

Возможный дубликат [Передача нескольких значений для одного параметра в службах Reporting Services] (http://stackoverflow.com/questions/512105/passing-multiple-values-for-a-single-parameter-in-reporting-services) – KyleMit

ответ

3

Проблема при запуске от SP, используя запрос, как это:

SELECT FirstName, LastName, Category     
FROM tblPerson 
WHERE (Category IN (@Category)) 

где @Category это что-то вроде 'Cat1,Cat2,Cat3'

является то, что статья IN лечит @Category как одна строка, то есть одно единственное значение, а не множество нескольких значений, поэтому, скорее всего, никогда не будет соответствовать чему-либо.

Вот почему, когда у вас есть только одно значение, оно работает - что-то вроде 'Cat1' будет соответствовать одному или нескольким строкам правильно.

При запуске как встроенный запрос в самом отчете SSRS будет рассматривать это как часть динамического T-SQL, что означает, что строка @Category добавляется в основной запрос, как написано и работает правильно.

Итак, для SP есть несколько вариантов.

Вы можете запустить динамический T-SQL в СП, что-то вроде:

DECLARE @Query NVARCHAR(max) = N'SELECT FirstName, LastName, Category 
     FROM tblPerson 
     WHERE (Category IN (' + @Category +))' 

EXEC @Query 

Динамический T-SQL редко идеально, поэтому другой вариант превратить @Category в набор для использования в запросе, как правило, используя функцию для разбиения строки и возвращает таблицу, которая будет выглядеть примерно так:

SELECT FirstName, LastName, Category     
FROM tblPerson 
WHERE (Category IN (SELECT values from dbo.SplitString(@Category))) 

есть любое количество способа получить набор, возвращаемый из разделителей строки.

См. Вопрос SO для many split options.

Или окончательная статья от Erland Sommarskog.

Выберите тот, который вам больше подходит, и отправляйтесь оттуда.

0

Вы можете использовать только IN со статикой, определенной в вашем запросе. При таком использовании Cas =

CREATE PROCEDURE [dbo].[usp_GetPerson](
@Category varchar(20)) 
AS 
BEGIN 
    SELECT FirstName, LastName, Category     
    FROM tblPerson 
    WHERE (Category = @Category) 
+0

Я тоже пытался это сделать, но заканчиваю с теми же результатами. – joha

+0

Каков тип данных категории? Является ли ваша БД нечувствительной к регистру? Также я бы запустил SQL Profiler, чтобы узнать, что отправляется на сервер, и попробуйте запустить код в SQL Management Studio, чтобы определить, была ли точная проблема. Это, наверное, что-то простое. – jcwrequests

0

--Found эта функция где-то на интернет-не может вспомнить, где

CREATE FUNCTION [dbo].[SplitString] (@stringToSplit VARCHAR(MAX)) 
RETURNS 
@returnList TABLE ([Name] [nvarchar] (500)) 
AS 
BEGIN 

DECLARE @name NVARCHAR(255) 
DECLARE @pos INT 

WHILE CHARINDEX(',', @stringToSplit) > 0 
BEGIN 
    SELECT @pos = CHARINDEX(',', @stringToSplit) 
    SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1) 

    INSERT INTO @returnList 
    SELECT @name 

    SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)[email protected]) 
END 

INSERT INTO @returnList 
SELECT @stringToSplit 

RETURN 
END 

--SP вход пары из отчета
@CarIds VARCHAR (100) CREATE Table #CarsTable (CarID VARCHAR (10))

INSERT #CarsTable 
SELECT LTRIM(Name) FROM dbo.SplitString(@carIds) 

Тогда для вашего запроса, вы бы сказали ...

WHErE CarsOwned IN (SELECT CarId FROM #CarsTable) 
Смежные вопросы