首先,標準答案 - 不在服務器上執行此操作。在客戶端解析字符串要容易得多。
其次,因爲它似乎這不是微不足道 - 這是解析,不分裂的字符串。在這種情況下,每個標記具有不同的含義。所有字符串拆分技術和STRING_SPLIT
命令都會返回一個無序令牌表。
三,分裂技術是最慢的一種,不能修改解析而不是拆分。最快的技術是SQLCLR和XML解析。兩者都可以修改爲返回一個包含多列的表格。
例如,下面的XML解析功能:
CREATE FUNCTION dbo.SplitStrings_XML
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
);
GO
作品由每個令牌周圍與i
標籤,產生<i>OMAHA</i><i>NE</i><i>68117</i>
。然後將其與CROSS APPLY x.nodes('i')
選擇具有標籤每個I
元素的內容,您可以將它修改爲巢的元素,並返回第一,第二和第三個元素,如下所示:
CREATE FUNCTION dbo.SplitTriplets_XML
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
SELECT
Item1 = o.i.value('@value', 'nvarchar(4000)'),
Item2 = p.i.value('@value', 'nvarchar(4000)'),
Item3 = q.i.value('@value', 'nvarchar(4000)')
FROM
(
SELECT x = CONVERT(XML, '<i value="'
+ REPLACE(@List, @Delimiter, '"><i value="')
+ '"></i></i></i>').query('.')
) AS a
OUTER APPLY x.nodes('/i') AS o(i)
OUTER APPLY x.nodes('/i/i') AS p(i)
OUTER APPLY x.nodes('/i/i/i') AS q(i)
)
在這種情況下, ,生成的XML是<i value="OMAHA"><i value="NE"><i value="68117" /></i></i>
和OUTER APPLY x.nodes('/i') AS p(i)
語句選擇根和嵌套標記作爲單獨的表。
這個例子:
declare @table table (id int,value nvarchar(200))
insert into @table
values
(1,'OMAHA NE 68117'),
(2,'sdfA Nw 68227')
select id,value,item1 as City,item2 as State,item3 as Zip
from @table x cross apply dbo.SplitTriplets_XML(value,' ')
返回:
id value City State Zip
----------- ----------------- ------ ------ ------
1 OMAHA NE 68117 OMAHA NE 68117
2 sdfA Nw 68227 sdfA Nw 68227
什麼你問?如何分割一個字符串(幾十個更快的重複)或如何編寫'SELECT @thisvariable = ...'語句?標準答案如何 - 不要嘗試在服務器上解析?如果名稱包含空格,分裂將失敗 –
我認爲他的問題是如何在每次迭代中將結果放入不同的變量中 –
您可以直接將第一個空格之前的字符指定爲城市到城市變量等,如果字符串要去以相同的順序。 – Coder1991