如何在SQL中解析逗号分隔的字符串变量

时间:2014-12-18 22:23:46

标签: sql-server

我在SQL Server 2008中工作。我有一个存储过程,它接受一个名为@test的参数。此参数是varchar(255)。在这个存储过程中,我需要解析这个字符串,将每个值转换为字符串本身(将有可变数量的值),并构建一个列表以在NOT IN语句中使用。

例如,假设@test =' a,b,c,d'。我需要将此参数发送到我的存储过程中。我的存储过程中有一个SELECT查询,它使用NOT IN语句。对于这个例子,我需要这个NOT IN语句来读取NOT IN(' a','',' c',' d' )。

我如何做到这一点?或者,这是一种不好的做法吗?

3 个答案:

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