将逗号分隔的字符串作为存储过程中的参数传递

时间:2014-04-14 18:00:48

标签: tsql sql-server-2008-r2

我正在编写一个存储过程,它根据传入其中的参数值调用嵌套存储过程。

我试图传递给子过程的一个参数是一串逗号分隔值。我在主程序中声明varchar并进行设置。

我的主存储过程如下所示:

Declare @StatusString varchar(150)
Set @StatusString = N'''OPEN,'',''CLOSED'',''PENDING'''

这会将@Status字符串变量作为参数传递给我的嵌套存储过程。

然后,我的嵌套存储过程

select from table where table.column in (@StatusString)

但是,我没有得到任何结果。看起来我要么没有正确传递参数,要么我没有正确地写出Select语句。我错过了什么?

2 个答案:

答案 0 :(得分:2)

SQL中的问题是您不能在字符串中使用逗号作为IN子句中的分隔符。 I.E ''OPEN,'',''CLOSED'',''PENDING''是单个字符串,而不是4个字段。

我知道只有两种可接受的方法可以做到这一点。

  1. 创建一个表值函数,该函数接受一个字符串并吐出一个记录集。然后,您可以将该记录集提供给临时表并对值执行连接,或者您可以将记录集用作in子句(I.E. WHERE column in (Select * from fn(@StatusString)))。

  2. 创建自定义数据类型并将自定义数据类型传递给存储过程。

  3. 请注意上面列出的字符串连接

答案 1 :(得分:1)

    CREATE FUNCTION Split
    (
      @delimited nvarchar(max),
      @delimiter nvarchar(100)
    ) RETURNS @t TABLE
    (
    -- Id column can be commented out, not required for sql splitting string
      id int identity(1,1), -- I use this column for numbering splitted parts
      val nvarchar(max)
    )
    AS
    BEGIN
      declare @xml xml
      set @xml = N'<root><r>' + replace(@delimited,@delimiter,'</r><r>') + '</r></root>'

      insert into @t(val)
      select
        r.value('.','varchar(max)') as item
      from @xml.nodes('//root/r') as records(r)

      RETURN
    END
    GO


    Declare @StatusString varchar(150)
    Set @StatusString = N'OPEN,CLOSED,PENDING'
--if you want them with quotes
--Set @StatusString = N'''OPEN'',''CLOSED'',''PENDING'''
    declare @t table (val nvarchar(100))
      insert into @t select * from dbo.split(@StatusString,',')
    select from table where table.column in (select val from @t)