2017-06-17 84 views
0

我跑這片分裂的文本字符串 - 變量與列

-- 
----------- 
DECLARE @QCSteps varchar(max) 
SET @QCSteps = '42 - step 0;#43 - step 1;#44 - step 2;#45 - step 3' 

DECLARE @separator varchar(max) 
SET @separator = ';#' 

DECLARE @Splited table(id int IDENTITY(1,1), item varchar(max)) 

SET @QCSteps = REPLACE(@QCSteps, @separator, ''' UNION ALL SELECT ''') 
SET @QCSteps = ' SELECT ''' + @QCSteps + ''' ' 

INSERT INTO @Splited 
EXEC(@QCSteps) 

SELECT * FROM @Splited 

和它產生的這種

---- 
--------------- 
[text string nicely split in 4][1] 

如何運行從現有的表列這種閱讀的文本字符串?

回答

1

你不能使用這種方法。

你需要CROSS APPLY到表值函數和TSQL表值函數不能執行動態SQL(CLR的人可以,但這將是愚蠢的,因爲這是微不足道的CLR分割字符串,無論如何這裏http://sqlblog.com/blogs/adam_machanic/archive/2009/04/28/sqlclr-string-splitting-part-2-even-faster-even-more-scalable.aspx)。

您將需要使用不同的分割函數實現。例如,一個從這裏https://sqlperformance.com/2012/07/t-sql-queries/split-strings

1

你可以嘗試以下解決方案,將原來的字符串轉換爲XML和(),然後將XML數據使用節點被撕碎的方法轉換成單獨的項目:

SELECT x.ID, y.XmlCol.value('(text())[1]', 'NVARCHAR(256)') AS ItemInnerText 
FROM (
    SELECT t.ID, CONVERT(XML, N'<root><i>' + REPLACE(t.QCSteps, N';#', N'</i><i>') + '</i></root>') AS QCStepsAsXML 
    FROM (
     SELECT 1, '42 - step 0;#43 - step 1;#44 - step 2;#45 - step 3' 
     UNION ALL 
     SELECT 2, 'AA - step 0;#BB - step 1' 
    ) AS t(ID, QCSteps) -- Replace FROM (...) AS t(ID, QCSteps) with FROM dbo.Table1 AS t 
) AS x 
CROSS APPLY x.QCStepsAsXML.nodes(N'root/i') AS y(XmlCol) 

結果: enter image description here

注意:如果原始字符串包含一些XML保留字符(例如<),此解決方案將生成一個異常。讓我知道如果這是你的情況。

0

這是一個XML安全內聯版本。

您可能還會注意到我們也返回了Item Sequence。這是可選的,但我發現它有很多用途。

Declare @YourTable table (ID int,SomeCol varchar(max)) 
Insert Into @YourTable values 
    (1,'42 - step 0;#43 - step 1;#44 - step 2;#45 - step 3') 

Select A.ID 
     ,B.* 
From @YourTable A 
Cross Apply (
       Select RetSeq = Row_Number() over (Order By (Select null)) 
         ,RetVal = LTrim(RTrim(P2.i.value('(./text())[1]', 'varchar(max)'))) 
       From (Select x = Cast('<x>' + replace((Select replace(A.SomeCol,';#','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as P1 
       Cross Apply x.nodes('x') AS P2(i) 
      ) B 

返回

ID RetSeq RetVal 
1 1  42 - step 0 
1 2  43 - step 1 
1 3  44 - step 2 
1 4  45 - step 3 
+0

好的,謝謝你 - 這個工作。 – texastonie

+0

@texastonie從來沒有懷疑過:) –