【问题标题】:Create function to split delimited seperated data for all records in the table [duplicate]创建函数以拆分表中所有记录的分隔数据[重复]
【发布时间】:2018-02-13 09:47:11
【问题描述】:

我有这样的输入-

select ID,FIELD from TABLE

1| A,B,C,D
2|X,Y,Z

这样的输出-

SELECT ID,FIELD from TABLE

1|A
1|B
1|C
1|D
2|X
2|Y
2|Z

有人可以帮助我,因为我怎样才能在 SQL Server 2014 中以简单的方式做到这一点?

【问题讨论】:

  • 运气不好,您必须清理某人的错误选择以将数据存储为逗号分隔项...
  • 顺便说一句,字段是一个非常糟糕的列名。
  • 我以Field为例,实际的字段没有这个名字:)

标签: sql sql-server split sql-server-2014


【解决方案1】:

您可以从 Aaron Bertrand 的 Split strings the right way – or the next best way 中选择一个字符串拆分函数,并将其与 cross apply 一起使用以从您的表中选择数据。 对于这个演示,我选择使用 XML 字符串拆分功能。
所以首先,创建函数:

CREATE FUNCTION dbo.SplitStrings_XML
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
   RETURN 
   (  
      SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
      FROM 
      ( 
        SELECT x = CONVERT(XML, '<i>' 
          + REPLACE(@List, @Delimiter, '</i><i>') 
          + '</i>').query('.')
      ) AS a CROSS APPLY x.nodes('i') AS y(i)
   );
GO

那么你需要做的就是这样的:

SELECT ID, Item
FROM TABLE
CROSS APPLY
dbo.SplitStrings_XML(FIELD, ',')

See a live demo on rextester.

另外,你可能应该阅读Is storing a delimited list in a database column really that bad?,在那里你会看到为什么这个问题的答案是肯定是的!

【讨论】:

  • 感谢您的努力,但它不起作用。不知道为什么
  • 你的意思是有点不工作?你收到错误了吗?你得到错误的结果了吗? I've tested your sample data on rextester 在我看来它工作得很好。
【解决方案2】:

你应该 XMLCROSS APPLY 不需要显式 Function

SELECT ID,
       split.a.value('.', 'NVARCHAR(MAX)') [FIELD]
FROM
(
    SELECT ID,
           CAST('<M>'+REPLACE([Field], ',', '</M><M>')+'</M>' AS XML) AS String
    FROM #TM
) AS a
CROSS APPLY String.nodes('/M') AS split(a);

结果:

ID FIELD
1  A
1  B
1  C
1  D
2  X
2  Y
2  Z

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2018-11-17
    相关资源
    最近更新 更多