这是我的场景,我正在使用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)
它运行并生成结果,这可能是什么原因??
谢谢..
答案 0 :(得分:1)
我已经解决了它,实际上在getDynmicQuery()中,我在查询的几个特定部分使用了很少的.Net函数。
现在的问题是,在查询文本中也有单引号,我用标准的SQL方式生成它们,即两个单引号,无论我在查询文本中需要一个单引号。对于UDF来说没关系,但对于创建问题的.Net函数来说没问题。
因为.Net函数生成的查询是简单的文本,我只是将它与另一个变量连接起来得到一个完整的查询,因此不需要在.Net函数中转义单引号。
无论何时我使用select它都是转义所以查询没问题,SELECT @dsql AS的情况也一样[processing-instruction(x)] FOR XML PATH(''),print()帮助我解决了这个问题,因为它没有逃脱任何东西,但问题是,这截断了我的查询,所以我尝试了一个特定的较短版本的查询进行测试..
由于我分两步生成脚本,
整个问题是单引号,最初在UDF和.Net函数中,我在生成的查询中需要一个单引号,我在动态查询文本中使用两个单引号(一个用于转义)。
我所做的更正是在.Net函数中,我在生成的查询中需要单引号,我现在使用单引号,没有转义。
现在每当在旧场景中,我使用select选择动态查询文本,单引号转义已完成,所以我没有收到确切的查询,打印做的是什么,它打印没有做任何转义,这使得有可能看到错误。
谢谢大家..
答案 1 :(得分:1)
使用:
PRINT(@dsql)
...在EXEC调用之前(应该使用EXEC sp_executesql
而不是btw),并测试打印输出以查看语法错误的来源。