Tsql 以编程方式创建用于IN语句的变量 请考虑以下脚本。

Tsql 以编程方式创建用于IN语句的变量 请考虑以下脚本。,tsql,sql-server-2000,ssrs-2008,Tsql,Sql Server 2000,Ssrs 2008,创建表: IF OBJECT_ID('Colortable') IS NOT NULL DROP TABLE ColorTable CREATE TABLE Colortable (Color VARCHAR(32)) GO 插入一些值: SET NOCOUNT ON INSERT Colortable SELECT 'red' INSERT Colortable SELECT 'orange' INSERT Colortable SELECT 'blue' INS

创建表:

IF OBJECT_ID('Colortable') IS NOT NULL
  DROP TABLE ColorTable

CREATE TABLE Colortable (Color VARCHAR(32))
GO
插入一些值:

SET  NOCOUNT ON

INSERT Colortable
  SELECT 'red'

INSERT Colortable
  SELECT 'orange'

INSERT Colortable
  SELECT 'blue'

INSERT Colortable
  SELECT 'green'
GO
自动创建我的变量(将成为SSRS中的参数):

声明@colors VARCHAR(1024)

当我使用“选择@colors”时,我得到以下信息:

'red','orange','blue','green'
但是,我的查询没有按预期工作

SELECT *
FROM colortable
WHERE Color IN ('red', 'orange', 'blue', 'green') -- Returns 4 rows. 


SELECT *
FROM colortable
WHERE Color IN (@colors) -- Returns 0 Rows

谁能告诉我为什么?我正在尝试生成一个值字符串,以便该脚本能够在SSR和SSM(或我正在使用的任何工具)中工作

@colors是单个varchar,而不是varchar列表。您可以做的是将您的值插入临时表,并根据临时表进行联接。

我认为您可以使用may work for your

+1:正确-使用单个变量表示逗号分隔的值列表意味着动态SQL。@etliens:还有一个变量不是,即不是+1我不能这样做,因为SQL语句将在SSRS中使用(转换为参数)在SSMS中作为SQL语句。如果我尝试使用表变量、任何类型的表等,它都不能用作SSRS参数。为什么SSRS不能调用存储过程?您可以在存储过程中执行任何操作,而不必处理单个SQL语句的限制。我不允许按照供应商的要求在数据库中创建SP这很糟糕,但这正是我要面对的。
SELECT *
FROM colortable
WHERE Color IN ('red', 'orange', 'blue', 'green') -- Returns 4 rows. 


SELECT *
FROM colortable
WHERE Color IN (@colors) -- Returns 0 Rows