0

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

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

     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%:'或':'分割。

4

1 回答 1

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
从显示 \\path\to\display - info
事件标签 STR.11
开始日期 '20130806 10:31:18'
结束日期“20130807 18:35:52”
三角洲 1D 08:04:34

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

于 2013-08-08T15:25:25.713 回答