8

SQL Server が処理できるクエリの長​​さに制限はありますか?

通常の SqlCommand オブジェクトがあり、非常に長い select ステートメントを文字列として渡します。

SQL Server 2005/2008 エンジンに対して実行すると、クエリは問題ないように見えますが、SQL Server 2000 エンジンに対しては実行されません。

この情報は第三者しか持っていないため、エラーの詳細はありませんが、アプリケーションが期待どおりに機能していません。私は SQL Server 2000 インスタンスをインストールする手間を省くことができましたが、簡単にインストールできる人がいないかどうか疑問に思っていました。はい、SQL Server 2000 には 4K または 8K の制限がありますが、2005 タイプの回答にはありません。

ストアドプロシージャを使用できることは承知していますが、それらを使用しない正当な理由があると仮定しましょう:-)

4

6 に答える 6

7

ここに考えがあります:

SQLServer 2000 の VARCHAR では最大 8000 文字まで使用できるため、次のようにするとうまくいく可能性があります。

PSeudoコード:

SQLCommand command = new SqlCommand("exec sp_executeSQL @CMD");
command.Parameters.Add(new SqlParameter("@CMD",YourDynamicSQL, VARCHAR);
于 2008-12-03T00:29:33.830 に答える
6

動的クエリについて読む必要があります... The Curse and Blessings of Dynamic SQLを読むことを強くお勧めします。今回は役に立たなかったかもしれませんが、将来必ず役に立ちます。

念のため記事から引用。

sp_executesql と SQL 2000 の長い SQL 文字列

SQL 2000 および SQL 7 では、4000 文字を超える長い SQL 文字列を使用できないため、sp_executesql には制限があります。(SQL 2005 以降では、この問題を回避するために nvarchar(MAX) を使用する必要があります。) パラメータ化されたクエリ プランを利用するためにクエリ文字列がこの制限を超えたときに sp_executesql を使用する場合、実際には回避策があります。つまり、EXEC() で sp_executesql をラップできます。

DECLARE @sql1 nvarchar(4000)、@sql2 nvarchar(4000)、@state char(2) SELECT @state = 'CA' SELECT @sql1 = N'SELECT COUNT(*)' SELECT @sql2 = N'FROM dbo.authors WHERE state = @state' EXEC('EXEC sp_executesql N''' + @sql1 + @sql2 + ''', N''@state char(2)'', @state = ''' + @state + '' '')

sp_executesql への @stmt パラメーターは ntext であるため、これは機能し、それ自体ではサイズに制限はありません。

次の例のように、INSERT-EXEC を使用して出力パラメーターを使用することもできます。

CREATE TABLE #result (cnt int NOT NULL) DECLARE @sql1 nvarchar(4000)、@sql2 nvarchar(4000)、@state char(2)、@mycnt int SELECT @state = 'CA' SELECT @sql1 = N'SELECT @ cnt = COUNT(*)' SELECT @sql2 = N'FROM dbo.authors WHERE state = @state' INSERT #result (cnt) EXEC('DECLARE @cnt int EXEC sp_executesql N''' + @sql1 + @sql2 + ' '', N''@state char(2), @cnt int OUTPUT'', @state = ''' + @state + ''', @cnt = @cnt OUTPUT SELECT @cnt') SELECT @mycnt = cnt FROM #結果

これが面倒すぎて価値がないと思うなら、あなたは私の理解を持っています.

于 2008-12-03T00:52:43.160 に答える
6

SqlServer 2000 では、アドホック クエリに対して 4000 文字のクエリ制限があります。

これをストアド プロシージャに抽象化できますか?

于 2008-12-03T00:05:49.493 に答える
2

AS/400 に対して実行するクエリの制限が 2k に達しました。私は通常、すべての空白を削除することで 2k の制限を下回ることができました。これにより、クエリが判読不能になりますが、制限を下回る最も簡単な方法です。

于 2008-12-03T01:24:29.990 に答える
2

私自身の経験では、クエリの長​​さに対する SQLServer2000 の制限のように最初に見えたものは、実際には (信じられないかもしれませんが) クエリの長​​さの制限ではなく、長さの制限であることがわかりました。クエリ内の任意の LINE の
これに遭遇したのは約1年前だったので、頭のてっぺんから行の長さを覚えていませんが、巨大なクエリを最大行長64K程度の行に分割してみてください。それがどうなるか見てください。私の記憶では、信じられないかもしれませんが、行の長さの制限は 64K だったかもしれません。この非常に長いクエリ (sql-generator プログラムによって生成されたもの) を取得しました。クエリの長​​さは約 80K で、メモ帳で半分に分割しました (つまり、SQL コードのほぼ中間点に改行を入れました)。 --- ただし、単語を分割しないように注意してください)、全体をクエリ アナライザーのコマンド ウィンドウに貼り付けました。その後、改行が途中にあるため、2行のそれぞれの長さが64K未満になりました。これが役立つことを願っています。そうでない場合は、行の長さを短くしてみてください。

于 2008-12-16T20:03:28.027 に答える
-2

SQL インジェクションのため、これを行わないでください。ユーザーがアプリの動的SQLをまったく操作できる場合は、これを放棄してください。

また、保守が容易で、SQL インジェクションにも役立つため、SP を検討してください。

于 2008-12-03T00:39:26.557 に答える