0

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

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

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

exec(@dsql)

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

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

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

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

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

谢谢..

4

2 回答 2

1

利用:

PRINT(@dsql) 

...在执行调用之前(应该使用EXEC sp_executesqlbtw),并测试 print 的输出以查看语法错误的来源。

于 2010-05-08T05:33:25.297 回答
1

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

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

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

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

编辑,更详细一点:

由于我分两步生成脚本,

  1. 在 UDF 内部
  2. .Net函数

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

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

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

谢谢大家..

于 2010-05-08T03:36:30.460 回答