2016-12-14 148 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

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

相关问题