如何在动态查询中围绕变量放置单引号

时间:2014-10-28 16:24:53

标签: mysql dynamic-sql

我正在尝试构建动态查询。最初@Query被设置为查询字符串,然后我想动态添加WHERE子句。它可以工作,除了在这种情况下@val不是在字符串周围放单引号。这会导致错误。如何包含单引号以便正确添加它们?

这是我尝试过的:

SET @Query = @Query + ' WHERE ' + '' + @param + ' ' + @operator + ' ' + '' + @val + '' ;

谢谢!

5 个答案:

答案 0 :(得分:1)

您必须在引号之间放置引号,但要将其转义以便不会破坏您的代码。它看起来如下:

SET @Query = @Query + ' WHERE ' + '' + @param + ' ' + @operator + ' ' + '\'' + @val + '\'' ;

编辑: Eric Anderson的回答也适用。取自MySQL 5.0 Manual

  

引用“'”的字符串中的“'”可写为“''”。

答案 1 :(得分:0)

这有效:

SET @Query = @Query + ' WHERE ' + '' + @param + ' ' + @operator + ' ' + '''' + @val + '''' ;

编程有时可能非常愚蠢。好的' 4个单引号。

无论如何,谢谢你们。

答案 2 :(得分:0)

试试这段代码:

DECLARE @SQ [varchar](1) = ''''

SET @Query = @Query + ' WHERE ' + @SQ + @param + @SQ + ' ' + @operator + ' ' + @SQ + @val + @SQ;

答案 3 :(得分:0)

 Object.defineProperty(Vue.prototype, '$route', {
    get: function get$1 () { return this.$root._route }
 })

答案 4 :(得分:0)

如果您使用的是MySQL,则需要知道+不是字符串连接运算符(这是Microsoft SQL Server和Access中的非标准语法)。

MySQL使用内置函数CONCAT()

SET @Query = CONCAT(@Query, ' WHERE ', @param, @operator, '?');
PREPARE stmt FROM @Query;
EXECUTE stmt USING @val;
DEALLOCATE stmt;

或者您可以设置ANSI模式(或更具体的PIPES_AS_CONCAT模式)并使用SQL标准字符串连接:

SET sql_mode = 'ANSI';
SET @Query = @Query || ' WHERE ' || @param || @operator || '?';
PREPARE stmt FROM @Query;
EXECUTE stmt USING @val;
DEALLOCATE stmt;

对于值,您不需要在SQL表达式中使用引号中的?占位符,实际上它不能用引号括起来,否则它将是一个文字'?'字符串,而不是参数占位符。

您无法参数化列名称或运算符,只能参数值。