我喜欢使用 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
函数必须首先删除分号,否则我们</value></pair><pair><property>
的 XML 字符串末尾会出现额外的内容。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 字符串通过函数转换为XML
数据类型CAST
。该CROSS APPLY
运算符可用于将 XML 文档的节点转换为t
具有行和列(别名为 )的类似表格的对象(别名为c
)。
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]