2016-12-14 144 views
2

我有一個從xml文件讀入的字符串。我需要將它分成三部分。我需要在插入查詢的select語句中運行此查詢。 UPDATE 我想在insert語句的select查詢中使用它。將具有多個分隔符的字符串拆分爲3個部分

插入到表1(COL1,COL2,公司,車站,地理位置優越,科隆) 選擇(在這裏,我想這個查詢每個列)

字符串的例子:

@declare exValue1 nvarchar(100) = 'Tempo > XNX (Marc) > Stores/Parts'; 
@declare exValue2 nvarchar(100) = 'Sedan 12 > XNX (Peter Inc) > Stores/Inventory'; 
@declare @company varchar(25); 
@declare @station varchar(25); 
@declare @location varchar(50); 

分隔符是4個字符,它總是相同的。

例如1弦,我需要拆分並分配

Tempo to company, XNX (Marc) to station, Stores/Parts to location. 

例如第二串

Sedan 12 to company, XNX (Peter Inc) to station, Stores/Inventory to location. 

我試圖substringcharindex但我只得到第1和第2字符串,但我不能沒有準確的位置字符串。任何幫助讚賞TIA。

select @company = SUBSTRING(@exValue1, 1, CHARINDEX('>', @test) - 1) 

select @station = SUBSTRING (@exValue1, CHARINDEX('>', @test) + 4, LEN(@test)) 

我無法確定位置和站位。

回答

4

這會給你字符串的三個部分,以

declare @exValue1 nvarchar(100) = 'Tempo > XNX (Marc) > Stores/Parts'; 

    SELECT LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS slices 
    FROM (SELECT CAST('<XMLRoot><RowData>' + REPLACE(@exValue1,'&gt;','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x)t 
    CROSS APPLY x.nodes('/XMLRoot/RowData')m(n) 

但是如果你想用變量的事,在這裏你去..

declare @exValue1 nvarchar(100) = 'Tempo &gt; XNX (Marc) &gt; Stores/Parts'; 

select SUBSTRING(@exValue1, 1, CHARINDEX('&gt;', @exValue1) - 1) 
set @exValue1 = SUBSTRING(@exValue1,CHARINDEX('&gt;', @exValue1)+4,len(@exValue1)) 
select SUBSTRING(@exValue1, 1, CHARINDEX('&gt;', @exValue1) - 1) 
set @exValue1 = SUBSTRING(@exValue1,CHARINDEX('&gt;', @exValue1)+4,len(@exValue1)) 
select @exValue1 
+1

你真的是一個黑暗騎士大聲笑 – Sakthivel

+0

@codebrain:lol..cheers !! :) – DarkKnight

2

創建函數一次和使用它百萬次:)

CREATE FUNCTION dbo.splitstring (@stringToSplit VARCHAR(MAX)) 
RETURNS 
@returnList TABLE ([Name] [nvarchar] (500)) 
AS 
BEGIN 

DECLARE @name NVARCHAR(255) 
DECLARE @pos INT 

WHILE CHARINDEX('&gt;', @stringToSplit) > 0 
BEGIN 
    SELECT @pos = CHARINDEX('&gt;', @stringToSplit) 
    SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1) 

    INSERT INTO @returnList 
    SELECT @name 

    SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+4, LEN(@stringToSplit)[email protected]) 
END 

INSERT INTO @returnList 
SELECT @stringToSplit 

RETURN 
END 

使用的功能:

declare @exValue1 nvarchar(100) = 'Tempo &gt; XNX (Marc) &gt; Stores/Parts'; 

declare @company varchar(25) 
set @company=(select top 1 name from dbo.splitstring(@exValue1)) 
declare @station varchar(25) 
set @station=(select top 1 name from dbo.splitstring(@exValue1) where name not in (select top 1 name from dbo.splitstring(@exValue1))) 
declare @location varchar(50) 
set @location=(select top 1 name from dbo.splitstring(@exValue1) where name not in (select top 2 name from dbo.splitstring(@exValue1))) 



print @company+' to comapny, '[email protected]+' to station, '[email protected]+' to location. ' 
+0

100%同意你創建一次哲學(+1),但是,當我看到線性分裂函數時,它會打破我的心。如果你想要頂級性能,請先看看udf here http:// stackoverflow。如何創建一個視圖顯示行從分裂數據/ 40852549#40852549 –

+0

頂級性能將與'clr'雖然。雖然你的功能還是非常棒的。 [https://sqlperformance.com/2012/07/t-sql-queries/split-strings](https://sqlperformance.com/2012/07/t-sql-queries/split-strings)@JohnCappelletti – SqlZim

+0

@ SqlZim顯然CLR會更快,但它並不總是一種選擇。即一些託管環境,許多公司將CLR視爲政策問題。 –

0

您可以嘗試使用REVERSE()得到Location像下面

declare @exValue1 nvarchar(100) = 'Tempo &gt; XNX (Marc) &gt; Stores/Parts'; 
declare @exValue2 nvarchar(100) = 'Sedan 12 &gt; XNX (Peter Inc) &gt; Stores/Inventory'; 
declare @company varchar(25); 
declare @station varchar(25); 
declare @location varchar(50); 

select @company= SUBSTRING(@exValue1,1,CHARINDEX('&gt;',@exValue1)-1) 
select @location = reverse(SUBSTRING(reverse(@exValue1),1, CHARINDEX(';tg&',reverse(@exValue1))-1)) 
select @station = REPLACE(REPLACE(REPLACE(@exValue1,@company,''),@location,''),'&gt;','') 

select @company company, @station station, @location location; 

這給了我下面的結果

enter image description here

0
declare @exValue1 nvarchar(100) = 'Tempo &gt; XNX (Marc) &gt; Stores/Parts' 
     ,@company varchar(25) 
     ,@station varchar(25) 
     ,@location varchar(50) 

select @company = x.value('(/r/e)[1]','nvarchar(25)') 
     ,@station = x.value('(/r/e)[2]','nvarchar(25)') 
     ,@location = x.value('(/r/e)[3]','nvarchar(50)') 

from (select cast ('<r><e>'+replace(@exValue1,'&gt;','</e><e>')+'</e></r>' as xml) as x) x 


select @company,@station,@location 

+-------+------------+--------------+ 
| Tempo | XNX (Marc) | Stores/Parts | 
+-------+------------+--------------+ 
+0

請檢查更新後的答案 –

1

試試這個吧。這將轉換爲一個動態的字符串,並會給出值

declare @exValue1 nvarchar(100) = 'Tempo &gt; XNX (Marc) &gt; Stores/Parts'; 
declare @exValue2 nvarchar(100) = 'Sedan 12 &gt; XNX (Peter Inc) &gt; Stores/Inventory'; 
declare @company varchar(25); 
declare @station varchar(25); 
declare @location varchar(50); 
DECLARE @Tbl AS TABLE(company varchar(25), station varchar(25), location varchar(50)) 

SET @exValue1 = 'SELECT '''+REPLACE(@exValue1,'&gt;',''' , ''')+'''' 
INSERT INTO @Tbl 
EXEC(@exValue1) 
SET @exValue2 = 'SELECT '''+REPLACE(@exValue2,'&gt;',''' , ''')+'''' 
INSERT INTO @Tbl 
EXEC(@exValue2) 

SELECT * FROM @Tbl 
+0

智能: - )...... –

相關問題