Java 中SQL查询 查询条件本身包含单引号怎么办?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 中SQL查询 查询条件本身包含单引号怎么办?相关的知识,希望对你有一定的参考价值。

如题,比如 select * from main where id = ' id'12345678' '这种怎么办? 尤其是当你的条件不是显示的,是一个不确定的字符串怎么办?

参考技术A 可以用转义字符啊。\'表示单引号。本回答被提问者和网友采纳 参考技术B 自身的用双引号试试?

不确定的模糊查询
select * from main where id like ' 12345678"'追问

我意思是查询条件不确定,id=?,根本不确定?号中哪里会有单引号,这怎么办?

当变量包含单引号时 SQL 动态查询字符串中断

【中文标题】当变量包含单引号时 SQL 动态查询字符串中断【英文标题】:SQL Dynamic Query String Breaks When Variable Contains Single Quote 【发布时间】:2013-08-20 20:50:07 【问题描述】:

我有一个这样的 SQL 查询字符串:

DECLARE @sql varchar(max)
SET @sql = ' INSERT INTO ' + @tempTable1 + 
           ' SELECT 0 as Type1, 0 as Type2, ' + 
             '''' + @name + ''' as CompanyName ' + 
           ' FROM #tempTable2 tt2'

查询运行良好,但两个名称恰好包含单引号(例如:Pete's Corner)。当这些名称中的任何一个成为查询的一部分时,它会破坏查询字符串。我认为最简单的方法是像这样替换单引号 replace(@name,'''','') 但它不起作用,因为我已经在一个字符串中,所以它会影响其余的该声明。不幸的是,改变表格本身不是一种选择。

如何替换或删除这些单引号?

补充:我很抱歉,我没有包括 @name 实际上是通过连接从另一个数据库表中填充的部分,因此在创建字符串之前设置 @name 的值我认为对我来说很困难。

【问题讨论】:

为什么在填充@name 时不能这样做? 【参考方案1】:

您为什么需要这样做?您应该将强参数传递给sp_executesql,而不是将所有参数转换为单个字符串并使用EXEC()。 More info on that here.

DECLARE @sql NVARCHAR(MAX), @name NVARCHAR(32);

SET @name = 'Pete''s Corner';

SET @sql = 'INSERT INTO ' + @tempTable1 +
  ' SELECT 0 as Type1, 0 as Type2, @name as CompanyName ' + 
  ' FROM #tempTable2 tt2';

EXEC sp_executesql @sql, N'@name NVARCHAR(32)', @name;

我认为@name 参数实际上是从其他地方填充的,如果使用适当的参数化,您不必处理转义'

现在我不太确定 @tempTable1 应该代表什么,或者您是否可以从此范围访问 #tempTable2,但是每当您发现自己运行需要 '''''''''' 的替换时(或两者),你应该问问自己是否有更好的方法。

【讨论】:

【参考方案2】:

我认为应该这样做:

 DECLARE @sql varchar(max)
SET @sql = ' INSERT INTO ' + @tempTable1 + 
       ' SELECT 0 as Type1, 0 as Type2, ' + ''''+
         replace( @name ,'''','''''')+''''+' as CompanyName  
       FROM #tempTable2 tt2'

【讨论】:

【参考方案3】:

您可以使用sp_executesql 系统程序。 sp_executesql 将允许您使用 @name 参数调用动态 SQL,而不是将其嵌入到 SQL 中。

DECLARE @sql nvarchar(max),
        @name varchar(50)
SET @name = 'qwe'''           
SET @sql = 'INSERT INTO ' + @tempTable1 +
           ' SELECT 0 as Type1, 0 as Type2, ' + 
           '@name as CompanyName ' + 
           'FROM #tempTable2 tt2'
--PRINT @sql
EXEC sp_executesql @sql, N'@name varchar(50)', @name

【讨论】:

以上是关于Java 中SQL查询 查询条件本身包含单引号怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询语句中,为啥在WHERE后面查询条件有的要加单引号,有的不用加,啥时候加,啥时候不加?

SQL查询的内容中含有单引号,怎么实现查询

sql注入过程中单引号和多个关键字被过滤怎么办?

java的jdbc问题,这堆引号看得有点糊涂,数据的操作怎么运用这些引号啊?

当变量包含单引号时 SQL 动态查询字符串中断

努力在 SQL 查询 C# QODBC 中转义单引号