Sql server 如何在sqlserver中将CSV选择为行和另一列

Sql server 如何在sqlserver中将CSV选择为行和另一列,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我在表格中有如下数据: id str -- -------------------- 1 123,456,234 2 17,54,22 3 4,7 4 432 5 1,82,2 我想要一个SELECT语句,它将id和str值分开。例如,我希望从上面的示例中获得以下输出: id str -- ---------- 1 123 1 456 1 234 2 17 2 54 etc

我在表格中有如下数据:

id    str
--    --------------------
 1    123,456,234
 2    17,54,22
 3    4,7
 4    432
 5    1,82,2
我想要一个SELECT语句,它将id和str值分开。例如,我希望从上面的示例中获得以下输出:

id     str
--     ----------
 1     123
 1     456
 1     234
 2     17
 2     54

etc

如何在SQLServer2008中获得此结果?

您可以使用
Split
函数。我用这个:

CREATE FUNCTION [dbo].[Split]
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1)
)
RETURNS @IDTable TABLE (Item VARCHAR(50))  
AS      

BEGIN    
    DECLARE @tempItemList NVARCHAR(MAX)
    SET @tempItemList = @ItemList

    DECLARE @i INT    
    DECLARE @Item NVARCHAR(4000)

    SET @tempItemList = REPLACE (@tempItemList, ' ', '')
    SET @i = CHARINDEX(@delimiter, @tempItemList)

    WHILE (LEN(@tempItemList) > 0)
    BEGIN
        IF @i = 0
            SET @Item = @tempItemList
        ELSE
            SET @Item = LEFT(@tempItemList, @i - 1)
        INSERT INTO @IDTable(Item) VALUES(@Item)
        IF @i = 0
            SET @tempItemList = ''
        ELSE
            SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i)
        SET @i = CHARINDEX(@delimiter, @tempItemList)
    END 
    RETURN
END  
现在您可以使用:

用你的样本数据

ID  STR
1   123
1   456
1   234
2   17
2   54
2   22
3   4
3   7
4   432
5   1
5   82
5   2
ID  STR
1   123
1   456
1   234
2   17
2   54
2   22
3   4
3   7
4   432
5   1
5   82
5   2