-1

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

column1 | column2
        |
abc fgt | rty lkj

我想根据第一个表创建另一个表,其中“abc”和“rty”在一行中,因为它们都位于第一个位置,“fgt”和“lkj”出于相同的关系原因在另一行中(他们排在第二位,依此类推):

column1 | column2
        |
abc     | rty
fgt     | lkj

我怎样才能做到这一点?

4

2 回答 2

1

您可以使用这样的功能

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

您需要将列作为输入参数传递。

SQL 小提琴演示

于 2013-09-26T06:37:15.583 回答
0

首先,您可以创建 UDF 以按特定分隔符拆分值(在您的情况下,这是 SPACE):

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 SELECT...查询就足够了:

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

Table_1是实际值所在Table_2的表,是最终行的表。

SQL 小提琴演示

于 2013-09-26T06:37:53.623 回答