SQL Like中的逗號分隔符
SQL Like中的逗號分隔符
在與數據庫交互的過程中,我們經常需要把一串ID組成的字符串當作參數傳給存儲過程獲取數據。很多時候我們希望把這個字符串轉成集合以方便用於in操作。 有兩種方式可以方便地把這個以某種符號分隔的ID字符串轉成臨時表。
代碼
代碼
代碼
方式一:通過charindex和substring。

create function func_splitstring
(@str nvarchar(max),@split varchar(10))
returns @t Table (c1 varchar(100))
as
begin
declare @i int
declare @s int
set @i=1
set @s=1
while(@i>0)
begin
set @i=charindex(@split,@str,@s)
if(@i>0)
begin
insert @t(c1) values(substring(@str,@s,@i-@s))
end
else begin
insert @t(c1) values(substring(@str,@s,len(@str)-@s+1))
end
set @s = @i + 1
end
return
end
(@str nvarchar(max),@split varchar(10))
returns @t Table (c1 varchar(100))
as
begin
declare @i int
declare @s int
set @i=1
set @s=1
while(@i>0)
begin
set @i=charindex(@split,@str,@s)
if(@i>0)
begin
insert @t(c1) values(substring(@str,@s,@i-@s))
end
else begin
insert @t(c1) values(substring(@str,@s,len(@str)-@s+1))
end
set @s = @i + 1
end
return
end
執行:select * from dbo.func_splitstring('1,2,3,4,5,6', ',')
結果:
方式二:通過XQuery(需要SQL Server 2005以上版本)。

create function func_splitid
(@str varchar(max),@split varchar(10))
RETURNS @t Table (c1 int)
AS
BEGIN
DECLARE @x XML
SET @x = CONVERT(XML,'<items><item margin:0px;padding:0px;line-height:1.5;color:rgb(255,0,0);">' + REPLACE(@str, @split, '"/><item margin:0px;padding:0px;line-height:1.5;color:rgb(255,0,0);">') + '"/></items>')
INSERT INTO @t SELECT x.item.value('@id[1]', 'INT') FROM @x.nodes('//items/item') AS x(item)
RETURN
END
(@str varchar(max),@split varchar(10))
RETURNS @t Table (c1 int)
AS
BEGIN
DECLARE @x XML
SET @x = CONVERT(XML,'<items><item margin:0px;padding:0px;line-height:1.5;color:rgb(255,0,0);">' + REPLACE(@str, @split, '"/><item margin:0px;padding:0px;line-height:1.5;color:rgb(255,0,0);">') + '"/></items>')
INSERT INTO @t SELECT x.item.value('@id[1]', 'INT') FROM @x.nodes('//items/item') AS x(item)
RETURN
END
執行:select * from dbo.func_splitid('1,2,3,4,5,6', ',')
結果:
其他寫法:

alter FUNCTION [dbo].[func_split](@str nvarchar(4000),@separtor varchar(10))
returns @temp table([row] [int] IDENTITY(1,1) NOT NULL,value nvarchar(4000))
as
begin
declare @i int
set @str=rtrim(ltrim(@str))
set @i=charindex(@separtor,@str)
while @i>=1
begin
insert @temp values(left(@str,@i-1))
set @str=substring(@str,@i+1,len(@str)-@i)
set @i=charindex(@separtor,@str)
end
if @str<>''
insert @temp values(@str)
return
end
returns @temp table([row] [int] IDENTITY(1,1) NOT NULL,value nvarchar(4000))
as
begin
declare @i int
set @str=rtrim(ltrim(@str))
set @i=charindex(@separtor,@str)
while @i>=1
begin
insert @temp values(left(@str,@i-1))
set @str=substring(@str,@i+1,len(@str)-@i)
set @i=charindex(@separtor,@str)
end
if @str<>''
insert @temp values(@str)
return
end
最後更新:2017-04-03 16:48:34