拆分字符串并将其存储在sql server中的三个不同变量中

时间:2017-06-19 08:30:20

标签: sql sql-server tsql sql-server-2012

我使用下面的函数将字符串拆分成多个字符串一切正常但我需要将结果存储到多个变量中

而不是将结果存储到表中

这是我的查询

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)) 

3 个答案:

答案 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