我喜欢使用XML转换在TSQL中拆分字符串。这种方法是首选,因为它不需要您在整个地方创建字符串拆分功能,并且以我的体验执行并可以很好地扩展。这里是一个SQLFiddle的例子。
DECLARE @TestConnectionString varchar(255) = 'Data Source=123.45.67.890;User ID=TestUser;Password=TestPassword;Initial Catalog=TestCatalogName;Provider=SQLNCLI11.1;Persist Security Info=True;Auto Translate=False;'
SELECT
t.c.value('(property)[1]','VARCHAR(200)') AS [property]
,t.c.value('(value)[1]','VARCHAR(200)') AS [value]
FROM (
SELECT CAST('<root><pair><property>' + REPLACE(REPLACE(LEFT(@TestConnectionString,LEN(@TestConnectionString)-1),';','</value></pair><pair><property>'),'=','</property><value>') + '</value></pair></root>' AS XML) AS properties_xml
) AS i
CROSS APPLY i.properties_xml.nodes('/root/pair') AS t(c)
说明:
的@TestConnectionString由该select语句格式为XML文档:
SELECT CAST('<root><pair><property>' + REPLACE(REPLACE(LEFT(@TestConnectionString,LEN(@TestConnectionString)-1),';','</value></pair><pair><property>'),'=','</property><value>') + '</value></pair></root>' AS XML) AS properties_xml
的XML字符串开头<root><pair><property>
,那么REPLACE
函数替换每个分界的分号为</value></pair><pair><property>
,并用</property><value>
替换每个分隔符号。 @TestConnectionString以分号结尾,因此分号必须先被LEFT
函数删除,否则我们最后会在XML字符串的末尾添加</value></pair><pair><property>
。 XML字符串通过附加</value></pair></root>
完成,我们结束了这样的:
<root>
<pair>
<property>Data Source</property>
<value>123.45.67.890</value>
</pair>
<pair>
<property>User ID</property>
<value>TestUser</value>
</pair>
<pair>
<property>Password</property>
<value>TestPassword</value>
</pair>
<pair>
<property>Initial Catalog</property>
<value>TestCatalogName</value>
</pair>
<pair>
<property>Provider</property>
<value>SQLNCLI11.1</value>
</pair>
<pair>
<property>Persist Security Info</property>
<value>True</value>
</pair>
<pair>
<property>Auto Translate</property>
<value>False</value>
</pair>
</root>
XML字符串被转换为与CAST
功能XML
数据类型。 运算符可用于将XML文档的节点转换为具有行和列(别名为c
)的类似表格的对象(别名为t
)。
CROSS APPLY i.properties_xml.nodes('/root/pair') AS t(c)
现在我们有一个表格,其中的行代表XML文档中的每个节点对。可以使用value
函数为我们要选择的每个列指定一个数据类型。
SELECT
t.c.value('(property)[1]','VARCHAR(200)') AS [property]
,t.c.value('(value)[1]','VARCHAR(200)') AS [value]
http://stackoverflow.com/questions/2647/split-string-in-sql –