2016-02-01 46 views
2

我在SQL Server 2012中的NVARCHAR字符串,像这样:如何提取SQL Server中的特定字符串?

declare @syncData nvarchar(4000) 
set @syncData = 'MyCol1="ABC" MyCol2="DEF" SiteCode="LA123" 

我想以后得到的数值SITECODE =”(即 'LA123')

我试图使用SUBSTRING用。 ?CHARINDEX,但没有运气(像什么建议here

我敢肯定有一个简单的方法来做到这一点

+0

SUBSTRING与CHARINDEX听起来像一个可行的解决方案。请详细说明你的尝试以及你期待的结果。 –

+1

您可以尝试正确的()函数... MSDN是[这里](https://msdn.microsoft.com/en-IN/library/ms177532.aspx) –

+0

闻起来像不好的设计给我。不同的数据应该存储在不同的列中。 –

回答

0

注意如何仅指@search一次@syncData两次,最少使用的功能来优化性能。

查找varchar中的子字符串。

DECLARE @search nvarchar(2000)= 'SiteCode' 
DECLARE @syncData nvarchar(4000)='MyCol1="ABC" MyCol2="DEF" SiteCode="LA123"' 
SET @search += '="' 

SELECT SUBSTRING(x.x, 0, CHARINDEX('"', x.x)) 
FROM 
    (SELECT RIGHT(@syncData, 
    NULLIF(CHARINDEX(REVERSE(@search), REVERSE(@syncData)), 0) - 1) x) x 

要在表中查找的字符串:

DECLARE @search nvarchar(2000)= 'MyCol2' 
SET @search += '="' 

DECLARE @t table(syncData nvarchar(4000)) 
INSERT @t values 
('MyCol1="ABC" MyCol2="DEF" SiteCode="LA123"'), 
('MyCol1="ABD" MyCol2="DEG" SiteCode="LA321"') 

SELECT SUBSTRING(x.x, 0, CHARINDEX('"', x.x)) 
FROM @t t 
CROSS APPLY 
    (SELECT RIGHT(syncData, 
    NULLIF(CHARINDEX(REVERSE(@search), REVERSE(syncData)), 0) - 1) x) x 
+0

非常感谢! :) – AshesToAshes

0

你可以试试这个:

declare @syncData nvarchar(4000) 
set @syncData = 'MyCol1="ABC" MyCol2="DEF" SiteCode="LA123"' 
select RIGHT(@syncData,LEN(@syncData)-(LEN(@syncData) - CHARINDEX('=', REVERSE(@syncData)) + 1)) 

SQL FIDDLE DEMO

如果你想摆脱双引号,那么你可以使用

declare @syncData nvarchar(4000) 
set @syncData = 'MyCol1="ABC" MyCol2="DEF" SiteCode="LA123"' 
select REPLACE(RIGHT(@syncData,LEN(@syncData)-(LEN(@syncData) - CHARINDEX('=', REVERSE(@syncData)) + 1)),'"', '') 

SQL FIDDLE DEMO

,或者您可以使用REPLACE(column,'"', '''')把值单引号。

+0

此解决方案不会找到特定标记,它只会找到最后一个标记 –

1

这里是这样的:

DECLARE @syncData AS nvarchar(4000), @vSiteCodeStartIndex AS INT, @vSiteCodeEndIndex AS INT; 
SET @syncData = 'MyCol1="ABC" MyCol2="DEF" SiteCode="LA123"'; 

SELECT @vSiteCodeStartIndex = CHARINDEX('SiteCode="',@syncData)+LEN('SiteCode="') 
SELECT @vSiteCodeEndIndex = CHARINDEX('"',@syncData,@vSiteCodeStartIndex); 

SELECT @syncData,SUBSTRING(@syncData, @vSiteCodeStartIndex, @[email protected]); 
+0

这工作正常,只是一个小问题,如果标签不存在,它会选择第一个值 –

0
declare @syncData nvarchar(4000) 
set @syncData = 'MyCol1="ABC" MyCol2="DEF" SiteCode="LA123"' 
select Left(RIGHT(@syncData,LEN(@syncData)-CHARINDEX('SiteCode="',@syncData)-9),5) 
+0

此语法不适用于不是最后一个标签的标签 –

0

你可以创建一个功能Reference

CREATE FUNCTION [dbo].[fnSplitValues] 
(
    @IDs nvarchar(max) 
) 
RETURNS 
@SplitValues TABLE 
(
    val nvarchar(max) 
) 
AS 
BEGIN 
    -- Fill the table variable with the rows for your result set 
    DECLARE @xml xml 
    SET @xml = N'<root><r>' + replace(@IDs,' ','</r><r>') + '</r></root>' 

    INSERT INTO @SplitValues(val) 
    SELECT r.value('.','nvarchar(max)') 
    FROM @xml.nodes('//root/r') as records(r) 

    RETURN 
END 

代码实现

declare @syncData nvarchar(4000) 
set @syncData = 'MyCol1="ABC" MyCol2="DEF" SiteCode="LA123" MyCol3="GHI"' 

SELECT SUBSTRING(REPLACE(val,'"',''), CHARINDEX('=', REPLACE(val,'"','')) + 1, LEN(REPLACE(val,'"',''))) 
FROM [dbo].[fnSplitValues](@syncData) 
where val like '%sitecode%' 
1

这工作,即使是在动态字符串:

declare @syncData nvarchar(4000) 
set @syncData = 'MyCol1="ABC" MyCol2="DEF" SiteCode="LA123" xqwxqxqxqxq dqw qdqw qw d' 

select substring(@syncData, 
    charindex('SiteCode="',@syncData)+len('SiteCode="'), 
    (charindex('"',@syncData,charindex('SiteCode="',@syncData)+len('SiteCode="'))) - (charindex('SiteCode="',@syncData)+len('SiteCode="'))) 
+0

这工作正常,只是一个小问题,如果标签不存在,它会选择第一个值 –

+0

@ t-clausen.dk是的,你是对的,但很简单'如果charindex('SiteCode ='',@ syncData)> 0'做的窍门 – krtek

+0

我知道它很小,alre ady upvoted。只是想提起 –

相关问题