TSQL通过分隔符或单词将字符串解析为列

时间:2013-08-08 14:51:21

标签: sql-server-2008 tsql

我们从一个表中选择数据,该表在单个列中存储了大量信息。我正在寻找一种将这些数据拆分成列的方法。

以下是返回的原始字符串的示例:

     From Display      : \\path\to\display - info Event Tag         : STR.11 Start Date        : '20130806 10:31:18'  End Date          : '20130807 18:35:52'  Delta            : 1D 08:04:34  Reason            : Machines : DownTime : Market Outage  Comment           : Market outage  Process           : ABCD  Equipment         :  Grade             : 123123  Logged By Process : ABC

如果我添加一些换行符以便更容易查看,那么这是数据。

From Display      : \\path\to\display - info 
Event Tag         : STR.11 
Start Date        : '20130806 10:31:18'  
End Date          : '20130807 18:35:52'  
Delta             : 1D 08:04:34  
Reason            : 
Machines : 
DownTime : Market Outage  
Comment           : Market outage  
Process           : ABCD  
Equipment         :  
Grade             : 123123  
Logged By Process : ABC

每个行标签之间的空格数与它们的':'并不总是相同,有些行可能没有右侧的任何数据,如上所示。

每行的字符数不一致。在上面的示例中,“评论”是“市场中断”,但如果有人要输入更多详细信息,则可以是段落。

如果我们选择多个记录,它们将以这种格式出现,我想将每个记录分析成列。所以我的结果看起来像:

Column headings (from display, event tag, start date, etc..)
Record 1 ----
Record 2 ----

我相信它可以通过'columnname%:'或':'来分割。

1 个答案:

答案 0 :(得分:0)

你需要为此编写一些脏代码。我没有看到任何其他选择。 如果您知道列名称,则应首先创建临时表。


CREATE TABLE #temp2 (column_name VARCHAR(500))
INSERT INTO #temp2
SELECT      'From Display'        UNION ALL
SELECT       'Event Tag'        UNION ALL
SELECT       'Start Date'        UNION ALL
SELECT       'End Date'        UNION ALL
SELECT       'Delta'
然后你需要修改输入字符串。我会加上&在每个列名称之前签名,您可以添加特定的字符或字符串。

DECLARE @string VARCHAR(8000)
DECLARE @column VARCHAR(200)
SET @string = 'From Display      : \path\to\display - info Event Tag         : STR.11 Start Date        : ''20130806 10:31:18''  End Date          : ''20130807 18:35:52''  Delta            : 1D 08:04:34'  

DECLARE some_cursor CURSOR FOR SELECT column_name FROM #temp2

OPEN some_cursor FETCH NEXT FROM some_cursor INTO @column WHILE @@FETCH_STATUS = 0 BEGIN SET @string = REPLACE(@string, @column, '&' + @column) FETCH NEXT FROM some_cursor INTO @column END CLOSE some_cursor DEALLOCATE some_cursor

/ Then you can perform simple parsing

SELECT SUBSTRING(item, 0, CHARINDEX(':', item)), SUBSTRING(item, CHARINDEX(':', item) + 1, LEN(item)) from dbo.fnasplit(@string, '&')

结果将像 -

column_name          column_vaue
From Display         \\path\to\display - info
Event Tag            STR.11
Start Date           '20130806 10:31:18'
End Date             '20130807 18:35:52'
Delta                1D 08:04:34

在此之后,您可以随意使用它。希望它有效。