WHERE IN子句中的Stored Procedure参数

时间:2014-08-19 13:40:32

标签: sql-server stored-procedures sql-server-2000

我有一个存储过程,它看起来像这样:

SELECT * FROM empTable
WHERE empCode IN (@employeeCode)

@employeeCode将接受另一个我无法控制该应用程序的应用程序的输入。它会给我string这样的内容:'M06', 'R02', 'B19', 'C10'

当我执行程序时,它返回0行。但是,当我使用以下查询在SQL Server中手动运行查询时:

SELECT * FROM empTable
WHERE empCode IN ('M06', 'R02', 'B19', 'C10')

它返回15行。

我怀疑当employeeCode接受输入时,它会假定整个'M06', 'R02', 'B19', 'C10'为一个string。任何人都可以证实吗?如果这是真的,我该如何解决它?

已编辑:我正在使用SQL Server 2000

2 个答案:

答案 0 :(得分:2)

或者只使用动态SQL。它看起来像这样:

EXEC('SELECT * FROM empTable WHERE empCode IN (' + @employeeCode + ')')

答案 1 :(得分:0)

这是您的救星! (5年后)

使用SQL函数!

以下代码是做什么的?

函数fn_split_string_to_column使用公共分隔符获取列表并返回表

CREATE FUNCTION [dbo].[fn_split_string_to_column] (
    @string NVARCHAR(MAX),
    @delimiter CHAR(1)
    )
RETURNS @out_put TABLE (
    [column_id] INT IDENTITY(1, 1) NOT NULL,
    [value] NVARCHAR(MAX)
    )
AS
BEGIN
    DECLARE @value NVARCHAR(MAX),
        @pos INT = 0,
        @len INT = 0

    SET @string = CASE 
            WHEN RIGHT(@string, 1) != @delimiter
                THEN @string + @delimiter
            ELSE @string
            END

    WHILE CHARINDEX(@delimiter, @string, @pos + 1) > 0
    BEGIN
        SET @len = CHARINDEX(@delimiter, @string, @pos + 1) - @pos
        SET @value = SUBSTRING(@string, @pos, @len)

        INSERT INTO @out_put ([value])
        SELECT LTRIM(RTRIM(@value)) AS [column]

        SET @pos = CHARINDEX(@delimiter, @string, @pos + @len) + 1
    END

    RETURN
END
SELECT * FROM empTable WHERE empCode IN (@employeeCode) -- this wont work!
SELECT * FROM empTable WHERE empCode IN (
    select value from fn_split_string_to_column(@employeeCode,',') -- this will work!
) 

示例!

  1. 使用逗号作为分隔符
declare @txt varchar(100) = 'a,b,c, d, e'
select * from fn_split_string_to_column(@txt,',')

查询结果:
enter image description here

  1. 使用空格作为分隔符
declare @txt varchar(100) = 'Did you hear about the guy who lost his left arm and left leg in an accident? He’s all right now.'
select * from fn_split_string_to_column(@txt,' ')

查询结果:
enter image description here

来源

以上功能不是我的。我是从以下问题的答案中借来的:How to split a comma-separated value to columns 去那里给他投票! (实际上,您应该去那里阅读有关您应该了解的性能问题的评论)