在SQL Server

时间:2015-08-10 15:37:56

标签: sql-server reporting-services

我正在使用加快问题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')

3 个答案:

答案 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作为联接。