Воссоздание источника данных SSRS в TSQL для тестирования - PullRequest
1 голос
/ 12 марта 2012

У меня есть источник данных SSRS, который я хотел бы проверить в SQL Server, чтобы я мог видеть точный набор результатов.В используемом мной отчете используется многозначный параметр в отчете, который передается в запрос в виде предложения

AND T.OrderType IN (@OrderType)

. То, что я хотел бы сделать, находится в верхней части оператора SQL дляобъявить переменную для ссылки здесь.Это пример подхода, который я попробовал и который не сработал

DECLARE @OrderType VARCHAR(255); SET @OrderType = '''StringValue1'',''StringValue2''';

Однако это не дало желаемых результатов (Записи не возвращались)

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

DECLARE @OrderType VARCHAR(255); SET @OrderType = 'StringValue1';

Ответы [ 3 ]

1 голос
/ 12 марта 2012

По сути, вы хотите, чтобы ваше предложение WHERE выглядело так: WHERE T.OrderType IN ('StringValue1','StringValue2',StringValue3').Это легко сделать, если преобразовать параметр SSRS в список через запятую и использовать переменную таблицы.

Во-первых, в свойствах набора данных в отчете SSRS вы можете изменить параметр с помощью выражения, которое преобразуетзначение параметра в несколько строк, разделенных запятыми: =Join(Parameters!OrderType.Value,",").

Чтобы имитировать это поведение в тестовом скрипте: SET @OrderType = 'String1, String2, String3'.

Далее, преобразуйте содержимое @OrderTypeв табличную переменную с UDF, которая анализирует список через запятую в переменную.Вы сможете найти множество примеров функций такого типа в Интернете.

Как только вы заполнили переменную таблицы (мы назовем ее @tblOrderType), вы можете использовать предложение WHERE, например, так:: T.OrderType IN (SELECT OrderType FROM @OrderType).

0 голосов
/ 13 марта 2012

Вы не можете сделать точно , что вы ищете, так как T-SQL сам по себе не расширит отдельный параметр в массив значений внутри предложения IN.

Однако эта статья о Массивах и списках в SQL Server 2008 с использованием табличных параметров (от Erland Sommarskog) может приблизить вас.

0 голосов
/ 13 марта 2012

Создайте нижеприведенную функцию.

СОЗДАЙТЕ ФУНКЦИЮ [dbo]. [Split] (@InputString nvarchar (max), @Delimiter nvarchar (50))

ВОЗВРАТЫВАНИЕ @Items TABLE (Элементnvarchar (max))

КАК НАЧАТЬ, ЕСЛИ @Delimiter = '' НАЧАТЬ НАБОР @Delimiter = ',' SET @InputString = REPLACE (@InputString, '', @Delimiter) END

  IF (@Delimiter IS NULL OR @Delimiter = '')
        SET @Delimiter = ','


  DECLARE @Item                 nvarchar(max)
  DECLARE @ItemList       nvarchar(max)
  DECLARE @DelimIndex     INT

  SET @ItemList = @InputString
  SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
  WHILE (@DelimIndex != 0)
  BEGIN
        SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)
        INSERT INTO @Items VALUES (@Item)

        SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+LEN(@Delimiter), LEN(@ItemList)-@DelimIndex)
        SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
  END -- End WHILE

  IF @Item IS NOT NULL -- At least one delimiter was encountered in @InputString
  BEGIN
        SET @Item = @ItemList
        INSERT INTO @Items VALUES (@Item)
  END

  -- No delimiters were encountered in @InputString, so just return @InputString
  ELSE INSERT INTO @Items VALUES (@InputString)

  RETURN

END

использовать этот оператор выбора в хранимой процедуре

Выбрать * из TableName, где AND T.OrderType IN (select * from dbo.Split (@OrderType, ','))

...