Sql server 2008 r2 使用光标显示行数据并将数据插入不同的列

Sql server 2008 r2 使用光标显示行数据并将数据插入不同的列,sql-server-2008-r2,Sql Server 2008 R2,嗨,我有一根绳子 'spla - asqlserver 2008 #P1 Q TY 1 :SPLA-WINSV QWSRSTDA#P29- 9 QTY2:SP LA-WINSVMSTDA #P29-999QTY2:SPLA-WINSVRSTD-sqlserver 2008#P 9 9 9 QT Y3:SPLA-WINSVRSTD #P 9-999QTY4 : SPLA-WINSVRSvr3# 59-99 Q TY5:SP -WI Sa 1 #P 999 Q T

嗨,我有一根绳子

'spla - asqlserver 2008 #P1           Q TY 1
:SPLA-WINSV  QWSRSTDA#P29- 9 QTY2:SP
LA-WINSVMSTDA #P29-999QTY2:SPLA-WINSVRSTD-sqlserver 2008#P 9  9 9 QT Y3:SPLA-WINSVRSTD #P 
9-999QTY4 : SPLA-WINSVRSvr3# 59-99 Q TY5:SP -WI  Sa 1 #P    999 Q T Y6'
我写的函数是

ALTER function [dbo].[string_splitting_WORKING]
(
 @STR VARCHAR(MAX),
 @DELIMITER CHAR(1)

)
RETURNS @Result Table
(
Output varchar(max)
)
as 
begin
DECLARE @Index int
declare @Output varchar(max)
select @index = 1
IF @STR IS NULL RETURN
WHILE @Index ! = 0
   BEGIN
      SELECT @Index = CHARINDEX(@Delimiter, @Str)
        IF @Index != 0
            SELECT @Output = LEFT(@Str, @Index - 1)
            --ltrim(ltrim(substring(@Str,0,charindex('#',@Str)))) 
            --LEFT(@Str, @Index - 1)
        ELSE
            SELECT @Output = @Str
        INSERT INTO @Result(Output) VALUES (@Output)
        SELECT @Str = RIGHT(@Str, LEN(@Str) - @Index)
        IF LEN(@Str) = 0 
        BREAK
    END
    RETURN
END;
当你像这样把字符串传给函数时

select * from [dbo].[string_splitting_WORKING]('SAQa # P 1      9 s-9    9 9 9  1:SPLA-WINSVRSTDA#P29-999QTY2
:SPLA-WINS VMSTDA#P 29-99 9Q TY2:SPLA-WggaerINSVRSTD# P3 9-9 99 9 Q TY3:SPLA-WINSVRSTD#P49-9999QTY4:SPLA-WINSVRSvr3#P59-9999QTY5:SPLA-WINSVRSat1#P69-9999QTY6 :',':')
SAQa # P 1      9 s-9    9 9 9  1
SPLA-WINSVRSTDA#P29-999QTY2  
SPLA-WINS VMSTDA#P 29-99 9Q TY2
SPLA-WggaerINSVRSTD# P3 9-9 99 9 Q TY3
SPLA-WINSVRSTD#P49-9999QTY4
SPLA-WINSVRSvr3#P59-9999QTY5
SPLA-WINSVRSat1#P69-9999QTY6 
     ServerName              PoNumber  Qty
------------------------------------------------
spla - asqlserver 2008        P        NULL
SPLA-WINSV  QWSRSTDA          P2       NULL
SP  LA-WINSVMSTDA             P29      NULL
SPLA-WINSVRSTD-sqlserver 2008 P 9      NULL
SPLA-WINSVRSTD                P   9    NULL
SPLA-WINSVRSvr3                59-99   NULL
SP -WI  Sa 1                  P    99  NULL
我得到这样的输出

select * from [dbo].[string_splitting_WORKING]('SAQa # P 1      9 s-9    9 9 9  1:SPLA-WINSVRSTDA#P29-999QTY2
:SPLA-WINS VMSTDA#P 29-99 9Q TY2:SPLA-WggaerINSVRSTD# P3 9-9 99 9 Q TY3:SPLA-WINSVRSTD#P49-9999QTY4:SPLA-WINSVRSvr3#P59-9999QTY5:SPLA-WINSVRSat1#P69-9999QTY6 :',':')
SAQa # P 1      9 s-9    9 9 9  1
SPLA-WINSVRSTDA#P29-999QTY2  
SPLA-WINS VMSTDA#P 29-99 9Q TY2
SPLA-WggaerINSVRSTD# P3 9-9 99 9 Q TY3
SPLA-WINSVRSTD#P49-9999QTY4
SPLA-WINSVRSvr3#P59-9999QTY5
SPLA-WINSVRSat1#P69-9999QTY6 
     ServerName              PoNumber  Qty
------------------------------------------------
spla - asqlserver 2008        P        NULL
SPLA-WINSV  QWSRSTDA          P2       NULL
SP  LA-WINSVMSTDA             P29      NULL
SPLA-WINSVRSTD-sqlserver 2008 P 9      NULL
SPLA-WINSVRSTD                P   9    NULL
SPLA-WINSVRSvr3                59-99   NULL
SP -WI  Sa 1                  P    99  NULL
我写了另一个函数

ALTER FUNCTION [dbo].[RowStringSplit] 
( 
        @RowData varchar(8000), 
        @Delimiter varchar(5) 
)   
RETURNS @RtnValue table  
(      ServerName varchar(1000),
        PoNumber varchar(500),
        Qty varchar(100))  
AS   
BEGIN  
        Declare @Cnt int 
        Set @Cnt = 1 

        While (Charindex(@Delimiter,@RowData)>0) 

     Begin 
                Insert Into @RtnValue (Servername,PoNumber)--,Qty) 

                Select  ServerName = ltrim(ltrim(Substring(@RowData,0,Charindex('#',@RowData)))),
                        --PoNumber   = ltrim(ltrim(substring(@RowData,charindex('#',@RowData)+1,CHARINDEX(':',@RowData)-1))) --1
                        --PoNumber   =  substring(@RowData,charindex('#',@RowData)+1,len(@RowData))                          --2

                        PoNumber = substring(@RowData,charindex('#',@RowData)+1,charindex('QTY',REVERSE(@RowData))+ @Cnt)--3

                          --PoNumber = case charindex('#',@RowData),1) when 0 then @RowData
                          --           else
                          --               substring(@RowData,1,charindex('QTY',@RowData,1)-1 

                          --Qty      = substring(@RowData,charindex('QTY',@RowData),Charindex(':',@RowData)-26)

             Set @RowData = Substring(@RowData,Charindex(@Delimiter,@RowData)+1,len(@RowData))
             Set @Cnt = @Cnt + 1 
      End 
       Insert  Into @RtnValue (ServerName)                                  
        Select Data = ltrim(rtrim(@RowData))
        Return 

END
我得到这样的输出

select * from [dbo].[string_splitting_WORKING]('SAQa # P 1      9 s-9    9 9 9  1:SPLA-WINSVRSTDA#P29-999QTY2
:SPLA-WINS VMSTDA#P 29-99 9Q TY2:SPLA-WggaerINSVRSTD# P3 9-9 99 9 Q TY3:SPLA-WINSVRSTD#P49-9999QTY4:SPLA-WINSVRSvr3#P59-9999QTY5:SPLA-WINSVRSat1#P69-9999QTY6 :',':')
SAQa # P 1      9 s-9    9 9 9  1
SPLA-WINSVRSTDA#P29-999QTY2  
SPLA-WINS VMSTDA#P 29-99 9Q TY2
SPLA-WggaerINSVRSTD# P3 9-9 99 9 Q TY3
SPLA-WINSVRSTD#P49-9999QTY4
SPLA-WINSVRSvr3#P59-9999QTY5
SPLA-WINSVRSat1#P69-9999QTY6 
     ServerName              PoNumber  Qty
------------------------------------------------
spla - asqlserver 2008        P        NULL
SPLA-WINSV  QWSRSTDA          P2       NULL
SP  LA-WINSVMSTDA             P29      NULL
SPLA-WINSVRSTD-sqlserver 2008 P 9      NULL
SPLA-WINSVRSTD                P   9    NULL
SPLA-WINSVRSvr3                59-99   NULL
SP -WI  Sa 1                  P    99  NULL
但要求是,如果我从serverName列中删除数据,它必须显示为空,如果 我增加了serverName列中的数据,它应该会增加,但我得到了 但问题是,如果我删除或添加数据后,直到数量,即从p到数量,重置它不准确,最后我只需要数量列中的数字

你能帮助我如何通过使用函数或过程分割字符串来获得正确的输出吗


从anand开始,请试试这个。看起来它为您的输入字符串返回了正确的输出。

与名为string\u spliting\u WORKING的函数一起执行:

它输出:

ServerName                     PoNumber Qty
------------------------------------------------
spla - asqlserver 2008          P1            1  
SPLA-WINSV  QWSRSTDA            P29-9         2
SP  LA-WINSVMSTDA               P29-999       2
SPLA-WINSVRSTD-sqlserver 2008   P999          3
SPLA-WINSVRSTD                  P  9-999      4
SPLA-WINSVRSvr3                 59-99         5
SP -WI  Sa 1                    P999          6