我们从一个表中选择数据,该表在单个列中存储了大量信息。我正在寻找一种将这些数据拆分成列的方法。
以下是返回的原始字符串的示例:
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%:'或':'来分割。
答案 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
在此之后,您可以随意使用它。希望它有效。