2016-02-01 44 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。只是想提起 –

相關問題