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