我有一个存储过程,它看起来像这样:
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
答案 0 :(得分:2)
或者只使用动态SQL。它看起来像这样:
EXEC('SELECT * FROM empTable WHERE empCode IN (' + @employeeCode + ')')
答案 1 :(得分:0)
这是您的救星! (5年后)
函数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!
)
declare @txt varchar(100) = 'a,b,c, d, e'
select * from fn_split_string_to_column(@txt,',')
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,' ')
以上功能不是我的。我是从以下问题的答案中借来的:How to split a comma-separated value to columns 去那里给他投票! (实际上,您应该去那里阅读有关您应该了解的性能问题的评论)