动态查询直接运行但不通过变量,可能是什么原因?

时间:2010-05-08 00:46:01

标签: sql sql-server sql-server-2005 tsql dynamic-sql

这是我的场景,我正在使用select语句创建动态查询,该语句使用函数生成查询。我将它存储到变量中并使用exec运行它。即。

declare @dsql nvarchar(max)
set @dsql = ''

select @dsql = @dsql + dbo.getDynmicQuery(column1, column2)
from Table1

exec(@dsql)

现在它在这种情况下会产生很多错误,例如“附近的语法不正确”,“和”案例表达式只能嵌套到第10级。“

但是,如果我从@dsql中获取文本并手动为其分配变量,如:

declare @dsql nvarchar(max)
set @dsql = ''

set @dsql = N'<Dynamic query text>'
exec(@dsql)

它运行并生成结果,这可能是什么原因??

谢谢..

2 个答案:

答案 0 :(得分:1)

我已经解决了它,实际上在getDynmicQuery()中,我在查询的几个特定部分使用了很少的.Net函数。

现在的问题是,在查询文本中也有单引号,我用标准的SQL方式生成它们,即两个单引号,无论我在查询文本中需要一个单引号。对于UDF来说没关系,但对于创建问题的.Net函数来说没问题。

因为.Net函数生成的查询是简单的文本,我只是将它与另一个变量连接起来得到一个完整的查询,因此不需要在.Net函数中转义单引号。

无论何时我使用select它都是转义所以查询没问题,SELECT @dsql AS的情况也一样[processing-instruction(x)] FOR XML PATH(''),print()帮助我解决了这个问题,因为它没有逃脱任何东西,但问题是,这截断了我的查询,所以我尝试了一个特定的较短版本的查询进行测试..

编辑,更多细节:

由于我分两步生成脚本,

  1. 在UDF内部
  2. .Net功能
  3. 整个问题是单引号,最初在UDF和.Net函数中,我在生成的查询中需要一个单引号,我在动态查询文本中使用两个单引号(一个用于转义)。

    我所做的更正是在.Net函数中,我在生成的查询中需要单引号,我现在使用单引号,没有转义。

    现在每当在旧场景中,我使用select选择动态查询文本,单引号转义已完成,所以我没有收到确切的查询,打印做的是什么,它打印没有做任何转义,这使得有可能看到错误。

    谢谢大家..

答案 1 :(得分:1)

使用:

PRINT(@dsql) 

...在EXEC调用之前(应该使用EXEC sp_executesql而不是btw),并测试打印输出以查看语法错误的来源。