2017-06-19 71 views
0

我使用下面的函數來分割字符串分爲多個字符串一切工作正常,但我需要的結果存儲到多個變量分割字符串,並將其存儲在SQL Server三個不同的變量

代替了結果被存儲到一個表

這是我的查詢

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

什麼你問?如何分割一個字符串(幾十個更快的重複)或如何編寫'SELECT @thisvariable = ...'語句?標準答案如何 - 不要嘗試在服務器上解析?如果名稱包含空格,分裂將失敗 –

+0

我認爲他的問題是如何在每次迭代中將結果放入不同的變量中 –

+0

您可以直接將第一個空格之前的字符指定爲城市到城市變量等,如果字符串要去以相同的順序。 – Coder1991

回答

1

,如果他們總是以相同的順序和相同的分隔那麼就沒有需要爲一個循環,這將完成所有的工作:

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

謝謝Jayvee :) –

0

如果有將是隻有3串(CIT,州和郵編),那麼下面選擇去給你拿結果。

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

在該行出現錯誤'傳遞給LEFT或SUBSTRING函數的長度參數無效。'at this line substring(@ siteIds,1,charindex('',@ siteIds)-1) –

+0

@EnigmaState字符串之間有多少空格? – Coder1991

+0

每個字符串之間有兩個空格 –

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>。然後將其與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 
相關問題