【问题标题】:Replace single quotes in SQL Server替换 SQL Server 中的单引号
【发布时间】:2010-11-29 06:29:06
【问题描述】:

我在 SQL Server 中有这个功能来替换单引号。

但是当我插入单引号时,它会在Replace(@strip,''','')) 上引发错误:

Create Function [dbo].[fn_stripsingleQuote]
    (@strStrip varchar(Max))
    returns varchar
as
begin
    declare @CleanString varchar(Max)
    SET @var=(Replace(@strip,'',''))

    return @var
end

【问题讨论】:

    标签: sql-server replace error-handling


    【解决方案1】:

    你可以使用 char(39)

    insert into my_table values('hi, my name'+char(39)+'s tim.')
    

    或者在这种情况下:

    Replace(@strip,char(39),'')
    

    【讨论】:

    • 这个解决方案的美妙之处在于它在某些情况下更容易阅读。谢谢。
    • 这始终是我的首选方式。双引号和四引号看起来很乱,而且更难维护。谢谢提醒。
    【解决方案2】:

    试试这个:

    select replace (colname, char(39)+char(39), '') AS colname FROM .[dbo].[Db Name];
    

    我已经达到了预期的结果。 示例:输入值 --> Like '%Pat') '' OR

          Want Output -->  *Like '%Pat') OR*
    

    使用上面的查询达到了预期的结果。

    【讨论】:

      【解决方案3】:

      select replace ( colname, '''', '') AS colname FROM .[dbo].[Db Name]

      【讨论】:

        【解决方案4】:

        我遇到了一个适用于此的奇怪异常。使用 Google API 并以 XML 格式获取回复,由于单引号,它无法转换为 XML 数据类型。

        替换(@Strip ,'''','')

        不起作用,因为单引号是 ascii 字符 146 而不是 39。 所以我用了:

        替换(@Strip, char(146), '')

        也适用于常规单引号 char(39) 和任何其他特殊字符。

        【讨论】:

        • 没有 ASCII 字符 146。扩展的 ASCII 定义了其他字符,例如一些国际字符、图形和符号。 char(146) 对应于该字符集中的拉丁语 Æ。如果该表达式有效,则它不对应任何有意义的内容。
        【解决方案5】:

        我认为这是最短的 SQL 语句:

        CREATE FUNCTION [dbo].[fn_stripsingleQuote] (@strStrip varchar(Max))
            RETURNS varchar(Max)
        AS
        BEGIN    
            RETURN (Replace(@strStrip ,'''',''))
        END
        

        我希望这会有所帮助!

        【讨论】:

          【解决方案6】:

          如果你真的必须完全去掉单引号,你可以这样做:

          Replace(@strip, '''', '')
          

          但是,通常您会将 ' 替换为 '',这将使 SQL Server 在查询数据库时感到满意。任何内置 SQL 函数(如替换)的诀窍在于它们也要求您将单引号加倍。

          因此,要在代码中将 ' 替换为 '',您可以这样做:

          Replace(@strip, '''', '''''')
          

          当然……在某些情况下,如果您在查询数据库时使用参数,您可以完全避免这样做。假设您正在从 .NET 应用程序查询数据库,那么您将使用 SqlParameter class 为查询提供 SqlCommand 参数,所有这些单引号业务都将自动处理。这通常是首选方法,因为 SQL 参数也有助于防止SQL injection 攻击。

          【讨论】:

          • 感谢您的提示,正在寻找如何将 ' 替换为 ' :)
          【解决方案7】:

          除了需要转义引号(通过使用双引号)之外,您还混淆了变量的名称:您使用的是@var 和@strip,而不是@CleanString 和@strStrip...

          【讨论】:

            【解决方案8】:

            试试REPLACE(@strip,'''','')

            SQL 使用两个引号来表示字符串中的一个。

            【讨论】:

              【解决方案9】:

              如果用另一个单引号转义你的单引号对你不起作用(就像我最近的一个 REPLACE() 查询一样),你可以在查询之前使用 SET QUOTED_IDENTIFIER OFF ,然后在之后使用 SET QUOTED_IDENTIFIER ON .

              例如

              SET QUOTED_IDENTIFIER OFF;
              
              UPDATE TABLE SET NAME = REPLACE(NAME, "'S", "S");
              
              SET QUOTED_IDENTIFIER OFF;
              

              【讨论】:

              • OP 似乎不明白为什么将单引号放在单引号内不起作用。更改引用标识符的方式不太可能解决这个问题。另外,这个问题是 3 岁...
              • OP 说他的函数的目的是替换单引号。我的解决方案确实是实现该功能的有效方法。此外,如果其他用户发现这个问题的答案对 REPLACE() 没有帮助,就像我的情况一样,这个解决方案可能确实有帮助。简而言之,我的回答可能对其他人有所帮助,即使不一定是 OP。如果问题对社区有帮助,问题的年龄有何不同?
              【解决方案10】:

              您似乎在尝试复制 QUOTENAME 功能。此内置函数可用于在字符串中添加分隔符和正确转义分隔符,并将单' 和双" 引号识别为分隔符,以及括号[]

              【讨论】:

              • QUOTENAME 用于 T-SQL 标识符。不幸的是,不适合数据。
              【解决方案11】:

              您需要将单引号加倍,如下所示:

              REPLACE(@strip, '''', '')
              

              【讨论】:

              • 我面临同样的问题,但使用你的技术我得到了 syntax error, unexpected '''' (T_CONSTANT_ENCAPSED_STRING)
              • REPLACE(@WAREHOUSE, '''', '''''')
              【解决方案12】:

              尝试用单引号转义单引号:

              Replace(@strip, '''', '')
              

              【讨论】:

                【解决方案13】:

                用户输入 (input sanitation) 中的单引号的条带化/替换/换行必须在 SQL 语句到达数据库之前完成

                【讨论】:

                • 也可以在inserts上完成,所以管理员不仅仅在dba上
                • 这意味着对 sql 注入开放的存储过程是可以的。我不同意这种暗示。
                • 如果与服务器实例交互的编码器试图故意制造 SQL 注入攻击怎么办?在 T-SQL/数据库端也应该进行一些验证/清理,特别是对于 @JohnDhom 所暗示的存储过程
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2018-12-03
                • 1970-01-01
                • 1970-01-01
                • 2023-03-17
                • 1970-01-01
                • 2018-12-19
                相关资源
                最近更新 更多