0

これが私のシナリオです。クエリを生成するために関数を使用する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)

それが実行されて結果が生成されますが、その理由は何でしょうか?

ありがとう..

4

2 に答える 2

1

私はそれを解決しました。実際にはgetDynmicQuery()内で、クエリのいくつかの特定の部分にいくつかの.Net関数を使用しています。

問題は、クエリテキストにも一重引用符があり、標準のSQL方法でそれらを生成していたことです。つまり、クエリテキストで一重引用符が必要な場合は常に2つの一重引用符を生成していました。UDFの場合は問題ありませんでしたが、問題が発生した.Net関数の場合は問題ありませんでした。

.Net関数によって生成されたクエリは単純なテキストであり、それを別の変数と連結して1つの完全なクエリを取得したため、.Net関数内で一重引用符をエスケープする必要はありませんでした。

selectを使用するたびにエスケープしていたので、クエリは問題ありませんでした。SELECT@dsql AS [processing-instruction(x)] FOR XML PATH('')の場合も同様で、print()はこれを理解するのに役立ちました。何もエスケープしませんでしたが、問題はクエリが切り捨てられたことでした。そのため、テスト用に特定の短いバージョンのクエリを試しました。

編集、もう少し詳細:

私は2つのステップでスクリプトを生成しているので、

  1. UDFの内部
  2. .Net関数

問題全体は一重引用符です。最初はUDFおよび.Net関数内で、生成されたクエリで1つの一重引用符が必要でしたが、動的クエリテキストで2つの一重引用符を使用しました(1つはエスケープ用)。

私が行った修正は、生成されたクエリで一重引用符が必要だった.Net関数で、エスケープなしで一重引用符を使用していることです。

以前のシナリオでは、selectを使用して動的クエリテキストを選択し、一重引用符のエスケープが行われたため、正確なクエリを受信しませんでした。印刷の内容は、エスケープせずに印刷されたため、次のことが可能になりました。エラーを参照してください。

みんなありがとう。

于 2010-05-08T03:36:30.460 に答える
1

使用する:

PRINT(@dsql) 

... EXEC呼び出しの前に(EXEC sp_executesql代わりにbtwを使用する必要があります)、印刷からの出力をテストして、構文エラーの原因を確認します。

于 2010-05-08T05:33:25.297 に答える