1

SQL の「分割」関数を使用したい:

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'),';')

エラー

サーバー: メッセージ 170、レベル 15、状態 1、行 1 行 1: '(' 付近の構文が正しくありません。サーバー: メッセージ 170、レベル 15、状態 1、行 1 行 1: ',' 付近の構文が正しくありません。

4

3 に答える 3

0

分割関数に CSV 文字列を渡す必要があります

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

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

@result を split 関数に渡す

Select * from dbo.Split3(@result,';')
于 2012-07-30T12:25:33.763 に答える
0

フィルタリングによってeqcode = 'EQL0000004'返される行が 1 つだけであるか複数であるかに関係なく、[dbo].[Split3]返された行ごとに次の関数を使用して関数を実行できCROSS APPLYます。

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

注:上記のソリューションは、次のように同じことを行います(これは、 Utkarshの回答CROSS APPLYに似ています):

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

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

違いはCROSS APPLY、クエリが複数の行を返す場合にも機能することです。

于 2012-07-30T17:12:40.090 に答える
0

この機能を試す

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

    Declare @remainingStr varchar(100)=@string
    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',',')
于 2012-07-30T14:30:04.423 に答える