如何在存储过程中将多个char作为变量传递?

时间:2016-09-21 08:11:28

标签: sql-server tsql stored-procedures

我创建了以下存储过程:

ALTER PROCEDURE [dbo].[CountInJunction]
        @Mod  as nvarchar(10),
        @Junction as nvarchar(10),
        @PJ as nvarchar(10),
        **@case as varchar(10)**,
        @Date as varchar(20)
    as

begin

declare @result as int

select @result = count(distinct CONCAT ([UCID],[CALLSEGMENT])) 

from IVR_LINES
where MODULE = @Mod and  DATE = @date
and EVENT_NAME = @Junction and **EVENT_VALUE in (@case)** 

insert into [dbo].[MainJuncTable] values(@Mod,@PJ,@Junction,@case,@result,null,null,@date)

return @result

end

我想将('0','5')传递为 @case

由于某种原因,我得到0结果,这是不正确的。似乎SP没有正确解释('0','5')。 我一直在尝试多种组合,例如:

'0', '5'

'0' + ' '+ 5''

'0,5'

等。

无效。

有什么办法可以正确传递这些字符吗?

感谢。

2 个答案:

答案 0 :(得分:0)

将值作为单个字符串发送,例如('0,5')

然后在需要拆分的情况下,选择像

这样的值
where EVENT_VALUE in (select val from Split(@case,',')) 

Split是用户定义的函数,您需要在使用它之前创建。

CREATE FUNCTION [dbo].[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

答案 1 :(得分:0)

在每种情况下,请将此作为参数值:'0,5'

但是如何使用它取决于您正在使用的sql server的版本。

如果你有2016年,那就是STRING_SPLIT。 https://msdn.microsoft.com/en-us/library/mt684588.aspx

如果没有,可以创建一个功能。请参阅相关的stackoverflow帖子:How to split a comma-separated value to columns 或者如果您想要行:SQL query to split column data into rows

(参见两者中评分较高的建议。)