2012-07-30 129 views
1

我想使用SQL “拆分” 功能:如何使用SQL SPLIT函数?

alter FUNCTION [dbo].[Split3] (@String nvarchar(1000), @Delimiter char(1))  
returns @temptable TABLE (items nvarchar(1000))  
as  
begin  
    declare @idx int  
    declare @slice nvarchar(1000)  

    select @idx = 1  
     if len(@String)<1 or @String is null return  

    while @idx!= 0  
    begin  
     set @idx = charindex(@Delimiter,@String)  
     if @idx!=0  
      set @slice = left(@String,@idx - 1)  
     else  
      set @slice = @String  

     if(len(@slice)>0) 
      insert into @temptable(Items) values(@slice)  

     set @String = right(@String,len(@String) - @idx)  
     if len(@String) = 0 break  
    end 
return  
end 


Select * from dbo.Split3 ((Select eqipproc from equipmast where eqcode = 'EQL0000004'),';') 

ERROR

服务器:消息170,15级,状态1,行 行1:附近有语法错误(' 。 服务器:消息170,15级,状态1,行 1行:附近有语法错误 ''

+0

为什么不创建一个sql clr函数?并使用.net框架拆分功能.. – 2012-07-30 12:45:01

回答

0

你必须CSV字符串传递给你的分割功能

DECLARE @result nvarchar(max) 
SET @result = '' 

SELECT @result = @result + [eqipproc ] + N';' 
equipmast where eqcode = 'EQL0000004' 

现在@result传递到您的分割功能

Select * from dbo.Split3(@result,';') 
0

试试这个功能

CREATE Function dbo.Str_Split(@string varchar(100),@dl varchar(2)) 
    Returns @outputtbl Table(col varchar(5)) 
    As 
    BEGIN 

    Declare @remainingStr varchar(100)[email protected] 
    if(CHARINDEX(@dl,@remainingStr,1) = 0) 
    begin 
    INSERT INTO @outputtbl 
    select @remainingStr 
    end 
    else 
    begin 
    While(CHARINDEX(@dl,@remainingStr,1) > 0) 
    BEGIN 
    INSERT INTO @outputtbl 
    select LEFT(@remainingStr,CHARINDEX(@dl,@remainingStr,1)-1) 
    SET @remainingStr=RIGHT(@remainingStr,LEN(@remainingStr)-CHARINDEX(@dl,@remainingStr,1)) 
    end 
    INSERT INTO @outputtbl 
    select @remainingStr 
    END 

    Return 
    END 
     --select * from dbo.Str_Split('ab,cd,efg',',') 
0

无论如果eqcode = 'EQL0000004'只返回一个排或一个以上的过滤功能,你可以执行你的[dbo].[Split3]通过使用每个返回行的功能CROSS APPLY

select s.* 
from equipmast as e 
cross apply dbo.Split3(e.eqipproc , ';') as s 
where e.eqcode = 'EQL0000004' 

注:与CROSS APPLY上述方案确实喜欢同一以下(这是类似Utkarsh's answer):

declare @s nvarchar(1000) 
select @s = eqipproc from equipmast where eqcode = 'EQL0000004' 

select * from dbo.Split3(@s, '.') 

不同的是,CROSS APPLY也适用,如果查询返回不止一行。