Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何替换SQL中的字符?_Sql_Sql Server - Fatal编程技术网

如何替换SQL中的字符?

如何替换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'<

它被给出: 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'<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,'[[',']]')
    */