使用每个CSV值创建行

时间:2013-06-26 08:25:57

标签: sql sql-server sql-server-2000

ID          Dates                                          Qty      Secs    DayPart

CO138491-02 06/10/2013,06/11/2013,06/12/2013,06/13/2013    4        6.00    Morning

如何在不使用CTE的情况下更改这些逗号分隔的值并得到这样的结果我在SQL SERVER 2000上,如果我们不使用循环,那么它会更好,后者数据会变得很大

CO138491-02 06/10/2013  4   6.00    Morning
CO138491-02 06/11/2013  4   6.00    Morning
CO138491-02 06/12/2013  4   6.00    Morning
CO138491-02 06/13/2013  4   6.00    Morning

任何提示都会受到赞赏或任何限制我搜索的链接

2 个答案:

答案 0 :(得分:4)

试试这个

SELECT          a.ID,
                SUBSTRING(',' + a.Dates + ',', n.Number + 1, CHARINDEX(',', ',' + a.Dates + ',', n.Number + 1) - n.Number - 1) AS [Value]
                , [Qty], [Secs], [DayPart]
FROM            Table1 AS a
INNER JOIN      master..spt_values AS n ON SUBSTRING(',' + a.Dates + ',', n.Number, 1) = ','
WHERE           n.Type = 'p'
                AND n.Number > 0 
                AND n.Number < LEN(',' + a.Dates + ',')

请查看以下链接以供参考

http://www.codeproject.com/Questions/526739/ConvertplusColumnplusdataplusintoplusRowsplusthrou

答案 1 :(得分:1)

如果您不想使用CTE或循环,请尝试使用附加数字表格的方法:

请参阅http://www.sommarskog.se/arrays-in-sql-2000.html#tblnum-core

类似的东西:

CREATE FUNCTION inline_split_me (@param varchar(7998)) RETURNS TABLE AS
   RETURN(SELECT substring(',' + @param + ',', Number + 1,
                    charindex(',', ',' + @param + ',', Number + 1) - Number - 1)
                 AS Value
          FROM   Numbers
          WHERE  Number <= len(',' + @param + ',') - 1
            AND  substring(',' + @param + ',', Number, 1) = ',')