如何替换SQL中的字符?
它被给出: xml字符串包含如下子字符串:如何替换SQL中的字符?,sql,sql-server,Sql,Sql Server,它被给出: xml字符串包含如下子字符串: N'<node action="i" s=""petya""></node>' N'' 如果字符串包含双精度“”,我需要做什么: 用action=“u”替换action=任何字符 将“”替换为“” 例如,结果: N'<node action="u" s="petya"></node>' N'' 将@String替换为您的列名: DECLARE @string NVARCHAR(100)=N'<
N'<node action="i" s=""petya""></node>'
N''
如果字符串包含双精度“”,我需要做什么:
N'<node action="u" s="petya"></node>'
N''
将@String替换为您的列名:
DECLARE @string NVARCHAR(100)=N'<node action="i" s=""petya""></node>'
SELECT CASE WHEN @string LIKE '%""%' THEN
REPLACE(SUBSTRING(@STRING,1,CHARINDEX('action="',@string,1)-1)+'action="u"'
+SUBSTRING(@STRING,CHARINDEX('action="',@string,1)+10,LEN(@STRING)),'""','"')
ELSE @STRING END
DECLARE@string NVARCHAR(100)=N''
当@字符串类似“%”时选择大小写,然后
替换(子字符串(@STRING,1,CHARINDEX('action=“”,@STRING,1)-1)+'action=“u”'
+子字符串(@STRING,CHARINDEX('action=“”,@STRING,1)+10,LEN(@STRING)),“”“,”)
ELSE@字符串结束
将@String替换为您的列名:
DECLARE @string NVARCHAR(100)=N'<node action="i" s=""petya""></node>'
SELECT CASE WHEN @string LIKE '%""%' THEN
REPLACE(SUBSTRING(@STRING,1,CHARINDEX('action="',@string,1)-1)+'action="u"'
+SUBSTRING(@STRING,CHARINDEX('action="',@string,1)+10,LEN(@STRING)),'""','"')
ELSE @STRING END
DECLARE@string NVARCHAR(100)=N''
当@字符串类似“%”时选择大小写,然后
替换(子字符串(@STRING,1,CHARINDEX('action=“”,@STRING,1)-1)+'action=“u”'
+子字符串(@STRING,CHARINDEX('action=“”,@STRING,1)+10,LEN(@STRING)),“”“,”)
ELSE@字符串结束
迟交的答案-只是提出一种替代方法(已经+1 Luv)
示例
Declare @S nvarchar(max) = N'<node action="i" s=""petya""></node>'
Select @S = replace(@S,sFrom,sTo)
From ( values ( 'action="i"','action="u"')
,( 'action="a"','action="u"')
,( 'action="d"','action="u"') -- Assuming a limited number of actions
,( '=""','="') -- Leading ""
,( '"">','">') -- Trailing ""
,( '"" ','" ') -- Trailing ""
) A(sFrom,sTo)
Select @S
迟交回答-只是为了提出一种替代方法(已经+1 Luv) 示例
Declare @S nvarchar(max) = N'<node action="i" s=""petya""></node>'
Select @S = replace(@S,sFrom,sTo)
From ( values ( 'action="i"','action="u"')
,( 'action="a"','action="u"')
,( 'action="d"','action="u"') -- Assuming a limited number of actions
,( '=""','="') -- Leading ""
,( '"">','">') -- Trailing ""
,( '"" ','" ') -- Trailing ""
) A(sFrom,sTo)
Select @S
老实说,如果您需要做任何严肃的XML工作,您应该考虑使用解析器,而不是脆弱的SQL Server查询。是的,您是对的。但是,在这种情况下,无法使用解析器,因为字符串是格式不好的XML。老实说,如果您需要做任何严肃的XML工作,您应该考虑使用解析器,而不是XML脆弱的SQL Server查询。是的,你是对的。但是解析器无法使用,因为在这种情况下字符串是格式错误的xml。只有一个注释:如果我有像action=“xxxx”这样的标记,它将替换为action=“u”xxx”只有一个注释:如果我有像action=“xxxx”这样的标记,它将替换为action=“u”xxx“好的,但在这种情况下,N''标记操作将在两个记录中替换为action=“u”,但只应在第一个记录中替换它record@Oleg片刻片刻fix@Oleg请参阅编辑多个节点OK,但在类似N“”的情况下,标记操作将在两个记录中替换为action=“u”,但它只能在第一次更换record@Oleg片刻片刻fix@Oleg请参见编辑多个节点
<node action="u" n="0" s="petya" />
<node action="i" n="2" s="vasya" />
CREATE FUNCTION [dbo].[tvf-Str-Extract] (@String varchar(max),@Delimiter1 varchar(100),@Delimiter2 varchar(100))
Returns Table
As
Return (
with cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
cte2(N) As (Select Top (IsNull(DataLength(@String),0)) Row_Number() over (Order By (Select NULL)) From (Select N=1 From cte1 N1,cte1 N2,cte1 N3,cte1 N4,cte1 N5,cte1 N6) A ),
cte3(N) As (Select 1 Union All Select t.N+DataLength(@Delimiter1) From cte2 t Where Substring(@String,t.N,DataLength(@Delimiter1)) = @Delimiter1),
cte4(N,L) As (Select S.N,IsNull(NullIf(CharIndex(@Delimiter1,@String,s.N),0)-S.N,8000) From cte3 S)
Select RetSeq = Row_Number() over (Order By N)
,RetPos = N
,RetVal = left(RetVal,charindex(@Delimiter2,RetVal)-1)
From (
Select *,RetVal = Substring(@String, N, L)
From cte4
) A
Where charindex(@Delimiter2,RetVal)>1
)
/*
Max Length of String 1MM characters
Declare @String varchar(max) = 'Dear [[FirstName]] [[LastName]], ...'
Select * From [dbo].[tvf-Str-Extract] (@String,'[[',']]')
*/