我喜欢使用 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>
使用CAST 函数将XML 字符串转换为XML 数据类型。
CROSS APPLY 运算符可用于将 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]