我在SQL Server 2008中工作。我有一个存储过程,它接受一个名为@test的参数。此参数是varchar(255)。在这个存储过程中,我需要解析这个字符串,将每个值转换为字符串本身(将有可变数量的值),并构建一个列表以在NOT IN语句中使用。
例如,假设@test =' a,b,c,d'。我需要将此参数发送到我的存储过程中。我的存储过程中有一个SELECT查询,它使用NOT IN语句。对于这个例子,我需要这个NOT IN语句来读取NOT IN(' a','',' c',' d' )。
我如何做到这一点?或者,这是一种不好的做法吗?
答案 0 :(得分:3)
您可以使用动态sql。使用replace函数获取正确的NOT IN()
参数:
DECLARE @test VARCHAR(10) = 'a,b,c,d'
DECLARE @sql NVARCHAR(MAX)
SELECT @sql = 'SELECT *
FROM #temp
WHERE label NOT IN (''' + REPLACE( @test ,',',''',''') + ''')'
EXEC sp_executesql @sql
答案 1 :(得分:3)
使用Split函数和NOT EXISTS运算符几乎总是比NOT IN运算符
更快CREATE FUNCTION [dbo].[split]
(
@delimited NVARCHAR(MAX),
@delimiter NVARCHAR(100)
)
RETURNS @t TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX))
AS
BEGIN
DECLARE @xml XML
SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>'
INSERT INTO @t(val)
SELECT r.value('.','varchar(MAX)') as item
FROM @xml.nodes('/t') as records(r)
RETURN
END
DECLARE @Table TABLE (Vals INT)
INSERT INTO @Table VALUES (1), (2), (3), (4)
DECLARE @test VARCHAR(256) = '3,4,5,6'
SELECT * FROM @Table
WHERE NOT EXISTS (SELECT 1
FROM [dbo].[split](@test , ',')
WHERE val = Vals)
Vals
1
2
答案 2 :(得分:0)
你可以在整个字符串中找到char或字符串,其分隔符为逗号(,)
null