动态SQL中的空字符串导致异常

时间:2014-08-11 23:48:40

标签: sql sql-server dynamic

我需要在商店过程中使用动态SQL。这是我的代码

set @value = ''(empty string)

set @SQL = 'INSERT INTO #temp(ID) 
        SELECT distinct contact.ID FROM contact     
        LEFT JOIN address on address.ID = contact.ID'       
set @where = 'where ' + @parameter + '=' + @value  + 'OR ' + @parameter + ' = address.cityCode'

begin   
    set @all =  @SQL + @where 
    EXEC sp_executesql @all
end

when transaction begins, @parameter also has a value of ''(empty string).

JDBC引发的异常:

Incorrect syntax near '='. at com.microsoft.jdbc.base.BaseExceptions.createException

我认为这是由空字符串的值引起的。那么在连接动态SQL时,如何使空字符串有效呢?谢谢!

2 个答案:

答案 0 :(得分:0)

您需要将空字符串包装在引号中。现在,它会显示WHERE parameter =OR,这显然是错误的语法。

更改您的代码以包含引号,它应该有效。

set @where = 'where ' + @parameter + ' = ''' + @value  + ''' OR ' + @parameter + ' = address.cityCode'

当然,请注意,在 设置@value的任何内容中,您都不会想要它们。因此,如果您考虑缺少引号,请将其删除,或将空@value设置为'''''(引号,两个转义引号,然后另一个引号)。

答案 1 :(得分:0)

  1. 对于标准应用程序make,在存储过程中编写动态SQL与在客户端代码中编写动态SQL一样糟糕。 SQL注入和性能仍然可以杀死你。

  2. 在您的SQL语句的上下文中,没有任何值可以通常分配给@parameter以使其正常工作,@parameter取代列名称(两次)你的SQL表达式。什么可能是一个有用的替代品?您可能在理论上测试@parameter并因缺少参数名称而生成不同的SQL(但您必须知道在您的情况下哪种替代方案会更好)。

  3. 如果使用嵌入式空格或SQL关键字等“非法”列名,则需要引用参数。

  4. 如果if表示字符串,您还需要引用@value。在T-SQL中,您还可以引用整数值等,而不会导致问题。

  5. 我是否提到即使在存储过程中也不要对这样的应用程序使用动态情况。