WHERE IN 子句中的存储过程参数

C.J*_*.J. 2 sql-server stored-procedures sql-server-2000

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

SELECT * FROM empTable
WHERE empCode IN (@employeeCode)
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT * FROM empTable
WHERE empCode IN ('M06', 'R02', 'B19', 'C10')
Run Code Online (Sandbox Code Playgroud)

它返回 15 行。

我怀疑当employeeCode接受输入时,它假设整个'M06', 'R02', 'B19', 'C10'为 ONE string。有人能证实这一点吗?如果这是真的,我该如何解决?

编辑:我正在使用 SQL Server 2000

ric*_*wtr 5

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

\n

使用 SQL 函数!

\n

下面的代码是做什么的?

\n

该函数fn_split_string_to_column使用通用分隔符获取列表并返回一个表

\n
CREATE FUNCTION [dbo].[fn_split_string_to_column] (\n    @string NVARCHAR(MAX),\n    @delimiter CHAR(1)\n    )\nRETURNS @out_put TABLE (\n    [column_id] INT IDENTITY(1, 1) NOT NULL,\n    [value] NVARCHAR(MAX)\n    )\nAS\nBEGIN\n    DECLARE @value NVARCHAR(MAX),\n        @pos INT = 0,\n        @len INT = 0\n\n    SET @string = CASE \n            WHEN RIGHT(@string, 1) != @delimiter\n                THEN @string + @delimiter\n            ELSE @string\n            END\n\n    WHILE CHARINDEX(@delimiter, @string, @pos + 1) > 0\n    BEGIN\n        SET @len = CHARINDEX(@delimiter, @string, @pos + 1) - @pos\n        SET @value = SUBSTRING(@string, @pos, @len)\n\n        INSERT INTO @out_put ([value])\n        SELECT LTRIM(RTRIM(@value)) AS [column]\n\n        SET @pos = CHARINDEX(@delimiter, @string, @pos + @len) + 1\n    END\n\n    RETURN\nEND\n
Run Code Online (Sandbox Code Playgroud)\n
SELECT * FROM empTable WHERE empCode IN (@employeeCode) -- this wont work!\n
Run Code Online (Sandbox Code Playgroud)\n
SELECT * FROM empTable WHERE empCode IN (\n    select value from fn_split_string_to_column(@employeeCode,\',\') -- this will work!\n) \n
Run Code Online (Sandbox Code Playgroud)\n

例子!

\n
    \n
  1. 使用逗号作为分隔符
  2. \n
\n
declare @txt varchar(100) = \'a,b,c, d, e\'\nselect * from fn_split_string_to_column(@txt,\',\')\n
Run Code Online (Sandbox Code Playgroud)\n

查询结果:
\n在此输入图像描述

\n
    \n
  1. 使用空格作为分隔符
  2. \n
\n
declare @txt varchar(100) = \'Did you hear about the guy who lost his left arm and left leg in an accident? He\xe2\x80\x99s all right now.\'\nselect * from fn_split_string_to_column(@txt,\' \')\n
Run Code Online (Sandbox Code Playgroud)\n

查询结果:
\n在此输入图像描述

\n

来源

\n

上面的函数不是我的。我借用了以下问题的答案:How to split a comma-separated value to columns \n去那里给他投赞成票!\n(实际上你应该去那里阅读有关你应该了解的性能问题的评论)

\n