Мне нравится использовать листинг 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 отформатирован как документ 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]
http://stackoverflow.com/questions/2647/split-string-in-sql –