【发布时间】:2015-04-13 16:51:25
【问题描述】:
我使用的是 SQL Server 2008 R2,我的数据格式为 AA-BB-CCCCCCCC-DDDDDDDD-EEEE,存储在一列中。我需要使用 T-SQL 内联将它分成 5 个单独的列(我不想为此创建一个函数,但如果有严重的性能提升我可能会调查它,这里有权限问题我将不得不处理)。我正在创建一个视图来模仿另一台服务器上类似表格的布局。
所以,我希望我的输出如下所示:
+------+------+----------+----------+------+
| Col1 | Col2 | Col3 | Col4 | Col5 |
+------+------+----------+----------+------+
| AA | BB | CCCCCCCC | DDDDDDDD | EEEE |
+------+------+----------+----------+------+
现在,我有一些可行的方法,但这对我来说似乎完全没有效率,并且在我的测试中针对这个视图执行查询非常耗时。我使用 CTE 和 XML 来拆分列,但这需要转义 & 号等操作。
所以,我目前拥有的是这样的:
WITH cte (ColA, ColB, Colc, etc.)
AS
(
SELECT
CONVERT(XML,'<Account><Attribute>'
+ REPLACE(REPLACE(MY_COLUMN,'&','&'),'-', '</Attribute><Attribute>')
+ '</Attribute></Account>') as ACCOUNT_VALUE
)
SELECT
ACCOUNT_VALUE.value('/Account[1]/Attribute[1]','varchar(2)') as Col1,
ACCOUNT_VALUE.value('/Account[1]/Attribute[2]','varchar(2)') as Col2,
ACCOUNT_VALUE.value('/Account[1]/Attribute[3]','varchar(8)') as Col3,
ACCOUNT_VALUE.value('/Account[1]/Attribute[4]','varchar(8)') as Col4,
ACCOUNT_VALUE.value('/Account[1]/Attribute[5]','varchar(4)') as Col5
FROM cte
这会很好地返回数据,但会花费非常长的时间。那么,有没有更好的方法将连字符的数据分成 T-SQL 语句中的列(最好没有函数等)?此表有数百万行需要分成单独的列。
我昨天通过几个小时的谷歌搜索走了这么远,但还没有真正找到我能够工作的另一个选择。
【问题讨论】:
-
正如我在问题中所说,我想避免使用函数或存储过程,因为我没有创建这些的权限。如果没有更好的方法,我可能会开始削减繁文缛节以通过它。
标签: sql sql-server tsql