SQL Server - 替换单引号并使用IN

时间:2009-10-22 20:07:24

标签: sql sql-server tsql

我将逗号分隔的值列表传递给存储过程。我需要执行查询以查看实体的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语句中使用参数,如上所述?谢谢!

6 个答案:

答案 0 :(得分:4)

你可以创建带参数的函数,将它滑动并返回包含所有数字的表。

如果您正在使用SQL Server中的列表或数组,我建议您阅读Erland Sommarskogs的精彩内容:

Arrays and Lists in SQL Server 2005

答案 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)

我也有几篇博文,有很多有趣的后续评论和对话:

More on splitting lists

Processing list of integers