我在SQL Server 2012中有一个NVARCHAR字符串,如下所示:
declare @syncData nvarchar(4000)
set @syncData = 'MyCol1="ABC" MyCol2="DEF" SiteCode="LA123"
我想在SiteCode =&#34之后获取值; (即' LA123')。
我试图在CHARINDEX上使用SUBSTRING,但没有运气(比如什么是here)。
我确定有一种简单的方法可以做到这一点吗?
答案 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, @vSiteCodeEndIndex-@vSiteCodeStartIndex );
答案 1 :(得分: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="')))
答案 2 :(得分: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,'"', '''')
将值放在单引号中。
答案 3 :(得分:0)
declare @syncData nvarchar(4000)
set @syncData = 'MyCol1="ABC" MyCol2="DEF" SiteCode="LA123"'
select Left(RIGHT(@syncData,LEN(@syncData)-CHARINDEX('SiteCode="',@syncData)-9),5)
答案 4 :(得分: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%'
答案 5 :(得分: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