Sql 分离同一数据库列中的记录

Sql 分离同一数据库列中的记录,sql,sql-server,Sql,Sql Server,对标题很抱歉,但这个问题很难概括。我正在处理一个构造糟糕的数据库,遇到一个表,该表在同一列上有多条记录,如下所示: | Column Header | Record1; Record2; Record3 我想问SQL中是否有任何方法可以使用分隔这些记录作为分隔符。我这样问是因为目前还不能重新创建数据库。快速解决方案- DECLARE @T TABLE ( Col NVARCHAR(2000), Col1 AS PARSENAME(REPLACE(Col, '; ', '.')

对标题很抱歉,但这个问题很难概括。我正在处理一个构造糟糕的数据库,遇到一个表,该表在同一列上有多条记录,如下所示:

| Column Header |

Record1; Record2; Record3
我想问SQL中是否有任何方法可以使用
分隔这些记录作为分隔符。我这样问是因为目前还不能重新创建数据库。

快速解决方案-

DECLARE @T TABLE
(
    Col NVARCHAR(2000),
    Col1 AS PARSENAME(REPLACE(Col, '; ', '.'), 3),
    Col2 AS PARSENAME(REPLACE(Col, '; ', '.'), 2),
    Col3 AS PARSENAME(REPLACE(Col, '; ', '.'), 1)
)

INSERT INTO @T (Col)
VALUES ('Record1; Record2; Record3')

SELECT * FROM @T
好的解决方案-规范化表

DECLARE @badData TABLE (id INT NOT NULL, txt NVARCHAR(max));

INSERT INTO @badData
VALUES (1, 'foo,bar,baz'), (2, NULL);;

-- the idea is to recursively 'pop' a value from the start of the string, splitting it into 'head' and 'tail' components
WITH unpacked (id, head, tail)
AS (
  SELECT id, LEFT(txt, CHARINDEX(',', txt + ',') - 1), STUFF(txt, 1, CHARINDEX(',', txt + ','), '')
  FROM @badData

  UNION ALL

  SELECT id, LEFT(tail, CHARINDEX(',', TAIL + ',') - 1), STUFF(tail, 1, CHARINDEX(',', tail+ ','), '')
  FROM unpacked
  WHERE tail > ''
  )
SELECT id, head
FROM unpacked
ORDER BY id

严重抄袭

所以,你的意思是说你希望这些记录按行分开…对吗?如果可能的话,这将是你想在其中使用的理想编程语言?这几乎每天都会在Stackoverflow上被问到,而且是这么多问题的重复。。。但是,没有一篇文章的答案比Aaron Bertrand的一系列文章提供的答案更好—[Split strings the right way–or the next best way](sqlperformance.com/2012/07/t-sql-queries/Split strings)和。感谢阅读材料!相当强的警告-限制为3个分隔符,并且不依赖于拆分的包含
的字符串。