我正在编写一个存储过程,它根据传入其中的参数值调用嵌套存储过程。
我试图传递给子过程的一个参数是一串逗号分隔值。我在主程序中声明varchar
并进行设置。
我的主存储过程如下所示:
Declare @StatusString varchar(150)
Set @StatusString = N'''OPEN,'',''CLOSED'',''PENDING'''
这会将@Status
字符串变量作为参数传递给我的嵌套存储过程。
然后,我的嵌套存储过程
select from table where table.column in (@StatusString)
但是,我没有得到任何结果。看起来我要么没有正确传递参数,要么我没有正确地写出Select
语句。我错过了什么?
答案 0 :(得分:2)
SQL中的问题是您不能在字符串中使用逗号作为IN子句中的分隔符。 I.E ''OPEN,'',''CLOSED'',''PENDING''
是单个字符串,而不是4个字段。
我知道只有两种可接受的方法可以做到这一点。
创建一个表值函数,该函数接受一个字符串并吐出一个记录集。然后,您可以将该记录集提供给临时表并对值执行连接,或者您可以将记录集用作in子句(I.E. WHERE column in (Select * from fn(@StatusString))
)。
创建自定义数据类型并将自定义数据类型传递给存储过程。
请注意上面列出的字符串连接不。
答案 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)