Sql server 如何编写此T-SQL游标?

Sql server 如何编写此T-SQL游标?,sql-server,tsql,cursor,Sql Server,Tsql,Cursor,我在一个表格的一个单元格中有多个值,它们之间用空格隔开。这就是我的表格的样子,每个单元格中的每个字符串之间都有一个空格: column1 | column2 | abc fgt | rty lkj 我想在第一个表的基础上创建另一个表,其中“abc”和“rty”位于一行,因为它们都位于第一位,“fgt”和“lkj”位于另一行,原因相同(它们位于第二位,依此类推): 我该怎么做呢?您可以使用这样的函数 IF EXISTS(SELECT * FROM sysobjects WHERE

我在一个表格的一个单元格中有多个值,它们之间用空格隔开。这就是我的表格的样子,每个单元格中的每个字符串之间都有一个空格:

column1 | column2
        |
abc fgt | rty lkj
我想在第一个表的基础上创建另一个表,其中“abc”和“rty”位于一行,因为它们都位于第一位,“fgt”和“lkj”位于另一行,原因相同(它们位于第二位,依此类推):


我该怎么做呢?

您可以使用这样的函数

IF EXISTS(SELECT * FROM sysobjects WHERE ID = OBJECT_ID('UF_CSVToTable'))
 DROP FUNCTION UF_CSVToTable
GO

CREATE FUNCTION UF_CSVToTable
(
 @psCSString VARCHAR(8000)
)
RETURNS @otTemp TABLE(sID VARCHAR(20),tID VARCHAR(20))
AS
BEGIN
 DECLARE @sTemp VARCHAR(10)
 DECLARE @tTemp VARCHAR(10)

 WHILE LEN(@psCSString) > 0
 BEGIN
  SET @sTemp = LEFT(@psCSString, ISNULL(NULLIF(CHARINDEX(' ', @psCSString) - 1, -1),
                    LEN(@psCSString)))
  SET @psCSString = SUBSTRING(@psCSString,ISNULL(NULLIF(CHARINDEX(' ', @psCSString), 0),
                               LEN(@psCSString)) + 1, LEN(@psCSString))
  INSERT INTO @otTemp(sID) VALUES (@sTemp)

  SET @tTemp = LEFT(@psCSString, ISNULL(NULLIF(CHARINDEX(' ', @psCSString) - 1, -1),
                    LEN(@psCSString)))
  SET @psCSString = SUBSTRING(@psCSString,ISNULL(NULLIF(CHARINDEX(' ', @psCSString), 0),
                               LEN(@psCSString)) + 1, LEN(@psCSString))
  UPDATE @otTemp SET tID=@tTemp WHERE sID=@sTemp                        
 END

RETURN
END
Go
可以这样叫

select * from UF_CSVToTable('1 2 3 4 5 6 7 15 55 59 86')
您需要将列作为输入参数传递


首先,您可以创建自定义项,用于按特定分隔符分割值(在您的情况下,这是空格):

表_1
是实际值所在的表,
表_2
是最后一行的表


一列中总是有两个字符串,还是可以有更多?问候@erfanic,我请求您在提问时更加具体,因为它有助于其他用户正确理解并为您提供准确(适当)的解决方案。顺便说一下,欢迎来到stackoverflow。快乐编码!!!您可以通过下面的链接获取有关提问的说明:感谢您的快速回复。问题是,每个单元格中可能(并且将会)有2个以上的字符串,字符串的数量也是可变的,这里我刚刚为实例输入了2个字符串。如何做到这一点?只需在第1列或第2列中添加更多字符串,代码就可以了。在演示中,在左侧,最初插入几个字符串,代码将按字符串中的位置放置它们。再看一次演示,了解快速响应。问题是,每个单元格中可能(并且将)有2个以上的字符串,字符串的数量也是可变的,这里我刚刚为实例输入了2个字符串。如何做到这一点?此外,字符串未知,唯一可以确定的是,第一列中的第一个字符串始终与第二列中的第一个字符串、第二到第二列、第三到第三列相关,依此类推。。。
select * from UF_CSVToTable('1 2 3 4 5 6 7 15 55 59 86')
CREATE FUNCTION [dbo].[Split](@String nvarchar(4000), @Delimiter char(1))       
returns @temptable TABLE (rownumber INT , items nvarchar(4000))       
as       
begin       
    declare @idx int       
    declare @slice nvarchar(4000) 
    DECLARE @rownumber int = 1     

    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(rownumber, Items) values(@rownumber, @slice)       

        set @String = right(@String,len(@String) - @idx) 
        SET @rownumber = @rownumber + 1      
        if len(@String) = 0 break       
    end   
return       
end  
GO
INSERT INTO dbo.Table_2
        ( column1, column2 )
SELECT 
    item1.items ,
    item2.items
FROM dbo.Split((SELECT column1 FROM dbo.Table_1), SPACE(1)) AS item1 
    FULL JOIN dbo.Split((SELECT column2 FROM dbo.Table_1), SPACE(1)) AS item2 
        ON item1.rownumber = item2.rownumber