我正在使用加快问题Here中显示的SSRS报告的说明。但是这个查询的不同之处在于SSRS报告中的一个参数会产生一个字符串列表,例如:
'100031', '100131', '114647', '115101'
这是我正在尝试的查询(使用参数硬编码)但是VarChar没有工作。有没有一种数据类型可以用来完成上面提到的字符串列表中的内容?
Declare @cust as VarChar(Max)
set @cust =
'100031',
'100131',
'114647',
'115101'
SELECT
DELIVERYNAME + ' ' + DELIVERYADDRESS AS 'Deliverly'
FROM
dbo.SALESLINE INNER JOIN
dbo.CUSTPACKINGSLIPTRANS ON ORIGSALESID = dbo.SALESLINE.SALESID AND dbo.SALESLINE.ITEMID = dbo.CUSTPACKINGSLIPTRANS.ITEMID
WHERE
CUSTACCOUNT in (@cust)
AND
dbo.CUSTPACKINGSLIPTRANS.CREATEDDATE BETWEEN '08/03/2015' AND '08/07/2015'
AND
dbo.SALESLINE.DIMENSION2_ IN ('08')
答案 0 :(得分:1)
没有"列表" SQL中的数据类型,但您可以使用varchar(或nvarchar)和动态SQL来完成您要执行的操作。例如:
Declare @cust as VarChar(Max)
set @cust = '100031, 100131, 114647, 115101'
DECLARE @sql as nvarchar(max) = '
SELECT
DELIVERYNAME + '' '' + DELIVERYADDRESS AS ''Deliverly''
FROM
dbo.SALESLINE INNER JOIN
dbo.CUSTPACKINGSLIPTRANS ON ORIGSALESID = dbo.SALESLINE.SALESID AND dbo.SALESLINE.ITEMID = dbo.CUSTPACKINGSLIPTRANS.ITEMID
WHERE
CUSTACCOUNT in (' + @cust + ')
AND
dbo.CUSTPACKINGSLIPTRANS.CREATEDDATE BETWEEN ''08/03/2015'' AND ''08/07/2015''
AND
dbo.SALESLINE.DIMENSION2_ IN (''08'')
'
-- this is the query that was generated
SELECT @sql
-- this executes the query
EXEC sp_executesql @sql
我将@cust
中的项目保留为整数,但如果您希望它们成为字符串,则必须在set @cust
时包含引号文字。
如果这是面向公众的内容并且通过用户输入获得@cust
参数,则可能存在SQL注入的一些问题。
答案 1 :(得分:1)
您可以创建一个表类型变量并将其作为READ ONLY传递。当您需要来自输入的类似行为的行为时,它会很有用。不幸的是,您不能拥有表类型输出参数。
create type dbo.CustomerIdArray as table (CustAccount int);
您可以将其作为READONLY传递给过程并加入它,就像它是一个表一样。您需要对其进行别名,因为您无法在连接语法中使用@。
答案 2 :(得分:1)
如果您不喜欢Table-type,并且无法访问Tally / Number表,那么这是一个使用common-table-expression为您提供Tally表的解决方案,您可以快速使用它将逗号分隔的字符串分隔为表变量的行。然后,您可以在连接中使用表变量。
-- Here's your original string:
Declare @cust as VarChar(Max)
set @cust = '100031, 100131, 114647, 115101'
-- Declare Table variable to hold the rows of @cust
declare @TableOfCustAccount Table (CUSTACCOUNT int not null);
-- comma-separated values must begin and end with commas:
set @cust = ',' + @cust + ',';
-- Tally table CTE: add more joins if you don't have enough N values
;with Tally
as (
select row_number() over (order by t1.column_id) as 'N'
from sys.columns t1
join sys.columns t2
on 1=1
-- You can get more N values by adding joins like this:
-- join sys.columns t3
-- on 1=1
)
insert @TableOfCustAccount (CUSTACCOUNT)
select substring(@cust,N+1,charindex(',',@cust,N+1)-N-1)
from Tally
where N < len(@cust)
and substring(@cust,N,1) = ',';
现在,您可以在查询中使用@TableOfCustAccount作为联接。