Во время тестирования я хочу вставить несколько значений в переменную

Я тестирую код sql, который может принимать в нем несколько значений, затем их сравнивают с помощью инструкции IN. Как имитировать это для тестирования. Heres, что я использую, но он ничего не возвращает, что неверно, потому что, когда я отправляю несколько значений в своем отчете SSRS, он работает. Я бы хотел, чтобы @item смоделировал, что он получает от SSRS при запуске отчета.

Declare
@item VarChar(100)

Set @item = ('1003932,1003933,1003934')




SELECT DISTINCT
 CUSTNAME,
 ISNULL(NAME, LOGCREATEDBY) AS 'Modified By'
 ,b.ITEMID as 'Item Id'
 ,[PRICE_NEW] as 'New Price'
 ,[PRICE_OLD] as 'Old Price'
 ,[PRICEUNIT_NEW] as 'New Unit Price'
 ,[PRICEUNIT_OLD] as 'Old Unit Price'
 ,LOGCREATEDDATE as 'Created Date' 
 ,(Select TOP 1 INVENTTRANS.DATEFINANCIAL From INVENTTRANS Where INVENTTRANS.ITEMID = @item order by INVENTTRANS.DATEFINANCIAL desc) As 'LastInvoice'
FROM PMF_INVENTTABLEMODULELOG AS b
 LEFT JOIN USERINFO ON ID = LOGCREATEDBY
 LEFT JOIN INVENTTABLE AS a on a.ITEMID in (@item)
WHERE b.ITEMID in (@item)
order by LOGCREATEDDATE desc
3 ответа

попробуй это...

Declare @item table
( item varchar(100)
)

INSERT INTO @item
SELECT '1003932' union all
SELECT '1003933' union all
SELECT '1003934']


SELECT DISTINCT
 CUSTNAME,
 ISNULL(NAME, LOGCREATEDBY) AS 'Modified By'
 ,b.ITEMID as 'Item Id'
 ,[PRICE_NEW] as 'New Price'
 ,[PRICE_OLD] as 'Old Price'
 ,[PRICEUNIT_NEW] as 'New Unit Price'
 ,[PRICEUNIT_OLD] as 'Old Unit Price'
 ,LOGCREATEDDATE as 'Created Date' 
 ,(Select TOP 1 INVENTTRANS.DATEFINANCIAL From INVENTTRANS Where INVENTTRANS.ITEMID = @item order by INVENTTRANS.DATEFINANCIAL desc) As 'LastInvoice'
FROM PMF_INVENTTABLEMODULELOG AS b
 LEFT JOIN USERINFO ON ID = LOGCREATEDBY
 LEFT JOIN INVENTTABLE AS a on a.ITEMID in (@item)
WHERE b.ITEMID in (SELECT item from @item)
order by LOGCREATEDDATE desc


Это невозможно сделать так.

Я бы предположил, что вы вставляете значения в переменную таблицы,

declare @items_table table (id int);
insert @items_table values ('1003932'),('1003933'),('1003934');

а затем измените предложение where в

WHERE b.ITEMID in (SELECT id FROM @items_table)

Или вы просто можете изменить предложение where:

WHERE b.ITEMID in ('1003932','1003933','1003934')


У меня была такая же проблема, особенно при работе с многопараметрическими переменными, заполняемыми из SSRS. Здесь решение, которое я нашел в некотором унаследованном коде, которое, по моему мнению, очень полезно. Ссылка на функцию от Мишель Уффорд на sqlfool.com. Ссылка: http://sqlfool.com/2011/05/string-parsing-function/

DECLARE @item VARCHAR(100)
SET @item = '1003932,1003933,1003934'

DECLARE @******** AS TABLE
(
 Item VARCHAR(7)
);

INSERT INTO @********
 ( Item )
SELECT stringValue
FROM Database.dbo.dba_parseString_udf(@item,',')

SELECT * FROM @********

Вставка SELECT Item FROM @******** вместо @item в вашем коде должна делать трюк. Лучше всего, используя этот подход, он позволяет легко заполнить запрос, когда вы хотите протестировать данные в SSMS, так как вы можете просто скопировать параметры, которые вы хотите из блока параметров SSRS. И этот код не нуждается в модификации вообще с помощью SSRS, так что комментирование первых двух строк кода сделает ваш код готовым принять несколько параметров от SSRS. ПРИМЕЧАНИЕ. По-видимому, это работает только тогда, когда вы используете хранимую процедуру в SSMS для инкапсуляции кода. Когда вы выбираете несколько параметров при использовании строки запроса в SSRS, вы получаете сообщение об ошибке:

Процедура или функция Database.dbo.dba_parseString_udf имеет слишком много аргументов.

Похоже, что аргументы передаются строкой в хранимую процедуру, но передаются как массив в строковый запрос.

licensed under cc by-sa 3.0 with attribution.