我将逗号分隔的值列表传递给存储过程。我需要执行查询以查看实体的ID是否在逗号分隔的列表中。不幸的是,我觉得我不明白。
执行以下存储过程时:
exec dbo.myStoredProcedure @myFilter=N'1, 2, 3, 4'
我收到以下错误:
"Conversion failed when converting the varchar value '1, 2, 3, 4' to data type int."
我的存储过程非常基本。它看起来像这样:
CREATE PROCEDURE [dbo].[myStoredProcedure]
@myFilter nvarchar(512) = NULL
AS
SET NOCOUNT ON
BEGIN
-- Remove the quote marks so the filter will work with the "IN" statement
SELECT @myFilter = REPLACE(@myFilter, '''', '')
-- Execute the query
SELECT
t.ID,
t.Name
FROM
MyTable t
WHERE
t.ID IN (@myFilter)
ORDER BY
t.Name
END
如何在SQL语句中使用参数,如上所述?谢谢!
答案 0 :(得分:4)
你可以创建带参数的函数,将它滑动并返回包含所有数字的表。
如果您正在使用SQL Server中的列表或数组,我建议您阅读Erland Sommarskogs的精彩内容:
答案 1 :(得分:3)
您需要拆分字符串并将其转储到临时表中。然后你加入临时表。
有很多例子,这里有一个是随机的。
http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/01/t-sql-split-function.aspx
答案 2 :(得分:2)
缺少分割功能,如下所示:
CREATE PROCEDURE [dbo].[myStoredProcedure]
@myFilter varchar(512) = NULL -- don't use NVARCHAR for a list of INTs
AS
SET NOCOUNT ON
BEGIN
SELECT
t.ID,
t.Name
FROM
MyTable t
WHERE
CHARINDEX(','+CONVERT(VARCHAR,t.ID)+',',@myFilter) > 0
ORDER BY
t.Name
END
表现不佳。每次都扫描一次表格。最好使用拆分功能。请参阅:http://www.sommarskog.se/arrays-in-sql.html
答案 3 :(得分:0)
我将创建一个函数,它接受逗号分隔的字符串并将其拆分并返回单个列表变量,其中每个值都在自己的行中。从IN语句中返回的表中选择该列。
答案 4 :(得分:0)
我找到了一种可爱的方式 - 但它闻起来有点味道。
declare @delimitedlist varchar(8000)
set @delimitedlist = '|1|2|33|11|3134|'
select * from mytable where @delimitedlist like '%|' + cast(id as varchar) + '|%'
所以......这将返回id等于1,2,33,11或3134的所有记录。
修改强>: 我还要补充一点,这不容易受到SQL注入的影响(而动态SQL依赖于您的白名单/黑名单技术来确保它不易受攻击)。它可能会对大量数据产生性能影响,但它可以正常工作并且很安全。
答案 5 :(得分:0)