我使用下面的函数将字符串拆分成多个字符串一切正常但我需要将结果存储到多个变量中
而不是将结果存储到表中
这是我的查询
DECLARE @strngLen int
DECLARE @split TABLE(siteId VARCHAR(100))
DECLARE @city varchar(100), @state varchar(100), @zip varchar(100)
SET @siteIds = 'OMAHA NE 68117'
SET @strngLen = CHARINDEX(' ', @siteIds)
WHILE CHARINDEX(' ', @siteIds) > 0
BEGIN
SET @strngLen = CHARINDEX(' ', @siteIds);
INSERT INTO @split
SELECT SUBSTRING(@siteIds,1,@strngLen - 1);
SET @siteIds = SUBSTRING(@siteIds, @strngLen+1, LEN(@siteIds));
END
INSERT INTO @split
SELECT @siteIds
SELECT * FROM @split
---Here i need to store the @siteIds into multiple local variables
---like in (@city varchar(100), @state varchar(100), @zip varchar(100))
答案 0 :(得分:2)
如果它们总是处于相同的顺序和相同的分隔符,则不需要循环,这将完成所有工作:
DECLARE @siteIds varchar(100)
DECLARE @city varchar(100), @state varchar(100), @zip varchar(100)
SET @siteIds = 'OMAHA NE 68117'
select @city=(parsename(replace(@siteIds,' ','.'),3)),
@state=(parsename(replace(@siteIds,' ','.'),2)),
@zip=(parsename(replace(@siteIds,' ','.'),1))
答案 1 :(得分:0)
如果只有3个字符串(cit,state和zip),则下面的选择将获取结果。
declare @str1 varchar(10)
declare @str2 varchar(10)
select @city= substring(@siteIds,1,charindex(' ',@siteIds)-1)
,@str1 = substring(@siteIds,charindex(' ',@siteIds)+1,len(@siteIds))
,@state = substring(@str1,1,charindex(' ',@str1)-1)
,@str2 = substring(@str1,charindex(' ',@str1)+1,len(@str1))
,@zip = substring(@str2,1,len(@str2))
答案 2 :(得分:0)
首先,标准答案 - 不要在服务器上执行此操作。在客户端解析字符串要容易得多。
其次,这并不像它看起来那么简单 - 这是解析,而不是拆分一个字符串。在这种情况下,每个令牌具有不同的含义。所有字符串拆分技术和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>
。然后,它选择带有I
CROSS APPLY x.nodes('i')
元素的内容
您可以将其修改为嵌套元素并返回第1,第2和第3个元素,如下所示:
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