【问题标题】:SQL Server Simple example for the use of Delimiter in Stored ProcedureSQL Server 存储过程中使用分隔符的简单示例
【发布时间】:2014-01-27 21:27:09
【问题描述】:
令人惊讶的是,没有任何直接的示例来演示在存储过程中使用分隔符吗?
我有一个字符串变量作为输入(带分隔符),并希望将其作为存储过程中的条件。如下所示:
CREATE PROCEDURE testing
(
@stringVar NVARCHAR(255) = NULL
)
....
BEGIN
Select * from table where column not in (@stringVar)
.....
END
@stringVar 的示例值为 a~b~c~d
我应该如何处理这种情况? Sql Server 中是否有内置的分隔符功能?
【问题讨论】:
标签:
sql
sql-server
stored-procedures
delimiter
【解决方案1】:
如果只是为了测试存在那么:
Select * from table where CHARINDEX('~'+column+'~' , '~'+@stringVar+'~' ,1)=0
【解决方案2】:
Sql Server 中没有任何内置的分隔符功能。为此,您可以使用用户定义的表值函数。
Create FUNCTION [dbo].[fnSplitString]
(@pString varchar(max),@pSplitChar char(1))
returns @tblTemp table (tid int,value varchar(1000))
as
begin
declare @vStartPosition int
declare @vSplitPosition int
declare @vSplitValue varchar(1000)
declare @vCounter int
set @vCounter=1
select @vStartPosition = 1,@vSplitPosition=0
set @vSplitPosition = charindex( @pSplitChar , @pString , @vStartPosition )
if (@vSplitPosition=0 and len(@pString) != 0)
begin
INSERT INTO @tblTemp
(
tid ,
value
)
VALUES
(
1 ,
@pString
)
return --------------------------------------------------------------->>
end
set @pString=@pString+@pSplitChar
while (@vSplitPosition > 0 )
begin
set @vSplitValue = substring( @pString , @vStartPosition , @vSplitPosition - @vStartPosition )
set @vSplitValue = ltrim(rtrim(@vSplitValue))
INSERT INTO @tblTemp
(
tid ,
value
)
VALUES
(
@vCounter ,
@vSplitValue
)
set @vCounter=@vCounter+1
set @vStartPosition = @vSplitPosition + 1
set @vSplitPosition = charindex( @pSplitChar , @pString , @vStartPosition )
end
return
end
【解决方案3】:
在 SQL Server 中实现拆分函数的方法有很多种,具有许多不同的性能特征:一些(ab)使用 SQL Server 的 XML 功能,一些使用 Tally 表,一些使用 CLR 等等。 em> 有关其中一种方法的描述和性能比较,我建议您查看 Jeff Moden 在SQL Server Central 上的文章(需要注册)。
一旦你有一个可用的表值拆分器函数,你就可以简单地实现你的选择:
select *
from MyTable t
where t.MyColumn not in (select Item from dbo.MySplit(@stringVar, '~') where Item is not null)
;
【解决方案4】:
这是一个有点棘手的情况,没有“简单的方法”来做到这一点。但我可以给你最简单的方法。
你需要做两件事来完成这项工作,
1) 创建一个Split函数,其参数为delimited
字符串并拆分这些值。
2) 将您的存储过程放在一个
传递分隔字符串的方式传递给该函数,然后
拆分后的值传递给存储过程
拆分函数
CREATE FUNCTION [dbo].[FnSplit]
(
@List nvarchar(2000),
@SplitOn nvarchar(5)
)
RETURNS @RtnValue table (Id int identity(1,1),Value nvarchar(100))
AS
BEGIN
While(Charindex(@SplitOn,@List)>0)
Begin
Insert Into @RtnValue (value)
Select Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))
Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
End
Insert Into @RtnValue (Value)
Select Value = ltrim(rtrim(@List))
Return
END
你的过程
CREATE PROCEDURE testing
(
@stringVar NVARCHAR(255) = NULL
)
....
BEGIN
Select * from table
where column not IN(SELECT Value
FROM dbo.FnSplit(@stringVar,'~'))
.....
END
【解决方案6】:
这没有简单的方法。我建议阅读this 文章。
您需要以编程方式拆分字符串。 sql中没有这个函数。