Sql server 2008 TSQL通过delimeter或words将字符串解析为列

Sql server 2008 TSQL通过delimeter或words将字符串解析为列,sql-server-2008,tsql,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:

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

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

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

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

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'
结果是:

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
之后你可以随意使用。希望它能起作用。

如果你真的得到了原始输出,那么就没有办法把它分开。我们怎么知道一列何时结束,另一列何时开始?我觉得我们遗漏了一些信息。也许pivot是您想要的方式,但您需要更好地解释此处发生的情况以及数据在表中的外观。冒号的数量是否一致?使用的程序有一个表单,在提交时将所有内容存储在一列中,这是一个我们无法更改的第三方应用程序。然而,列的数量应该总是相同的。列名总是相同吗?那么,您的表看起来基本上像有换行符的部分吗?由于只有一列,每一行包含每一行信息?我在dbo.fnasplit上得到一个无效的对象名。这是一个需要添加的函数吗?使用任何一个拆分函数,如果使其中一个函数工作起来有点困难,它们都返回int。那么上次查询中没有定义item,这与@string相同吗。拆分函数适用于所有数据。确保将Returns@Tbl_IDs Table ID Varchar500更改为Returns@Tbl_IDs Table item Varchar500,如在函数中一样。item应该是函数返回的表的列名。因此,在功能上进行上述更改。 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