以编程方式创建与 IN 语句一起使用的变量
请考虑以下脚本。
创建表:
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 中的参数):
DECLARE @colors VARCHAR(1024)
SELECT @colors =
COALESCE(
@colors + '''' + ',' + '''', '') +
Color
FROM Colortable
当我使用“Select @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
谁能告诉我为什么?我正在尝试生成一串值,以便该脚本可以在 SSRS 和 SSMS(或我正在使用的任何工具)中运行。
Please consider the following scripts.
Create Table:
IF OBJECT_ID('Colortable') IS NOT NULL
DROP TABLE ColorTable
CREATE TABLE Colortable (Color VARCHAR(32))
GO
Insert some values:
SET NOCOUNT ON
INSERT Colortable
SELECT 'red'
INSERT Colortable
SELECT 'orange'
INSERT Colortable
SELECT 'blue'
INSERT Colortable
SELECT 'green'
GO
Create my Variable (which will become a paramter in SSRS) automatically:
DECLARE @colors VARCHAR(1024)
SELECT @colors =
COALESCE(
@colors + '''' + ',' + '''', '') +
Color
FROM Colortable
When I use "Select @colors" I get the following:
'red','orange','blue','green'
However, my queries do not work as expected.
SELECT *
FROM colortable
WHERE Color IN ('red', 'orange', 'blue', 'green') -- Returns 4 rows.
SELECT *
FROM colortable
WHERE Color IN (@colors) -- Returns 0 Rows
Can anyone tell me why? I am trying to generate a string of values so that this script will work in SSRS and SSMS (or whatever tool I am using).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我认为您可以使用
sp_executesql
可能为你工作i think you can use
sp_executesql
may work for you@colors 是单个 varchar,而不是 varchar 列表。相反,您可以做的是将您的值插入到临时表中并对其进行连接。
@colors is a single varchar, not a list of varchars. What you can do instead is insert your values into a temp table and join against that.