2016-11-23 21 views
1

私は非常に長い動的SQL文(13000文字以上)を使用していますが、実行しようとしているときにexecが文を完全に読んでいないことに気づいています最後の部分をオフにします。動的SQL文が長すぎます

私が使用しています:

DECLARE @Statement nvarchar(max) 
SET @Statement = N'[LONG STATEMENT]' 
EXEC (@Statement) 

は私がEXEC (@Statement)

にブラケットを使用していない場合には、さらに少ない文字を読むことができることを、予告をした私もそれはちょうど停止しEXEC sp_executesql @Statement を使用してみました12482文字後のステートメントを読む... SQL Server 2008 R2とSQL Server 2014に問題があります

EDIT:今、私は別の何かに気づいた。声明の長さ自体はまさに問題ではないようです。私は、新しいストアドプロシージャを追加する更新スクリプトを作成しているので、このプロシージャ内でテーブル名を使用していますので、この長い動的SQL文を使用しています。そこで、テーブル名を含む変数を作成し、動的SQL文でこれらの変数を使用したので、この更新スクリプトで追加するプロシージャや関数内でテーブル名を変更する必要はありません。変数。 しかし、これらの変数を使用せず、ステートメントでテーブル名が「ハードコード」されていれば、ステートメントは正常に実行できます...

+0

は恐ろしいですね。どのような動的SQLを使用する理由は何ですか?あなたはそのステートメントをより小さなステートメントに分割することはできませんか? – Tanner

+3

制限は約2GBなので、これは問題ではありません。どのように切り捨て点を決定していますか? SSMSの結果ビューには、表示される最大データとして設定可能な制限があることに注意してください。 –

+1

* "私は、エグゼクティブがステートメントを完全に読んでいないことに気づき、最後の部分を切り捨てる" * * –

答えて

4

私は答えはここにあると思います:

だから私は、テーブル名を含む変数を作成し、動的SQL文でこれら の変数を使用し、私は テーブル名を変更する必要はありませんプロシージャと関数の中で このアップデートスクリプトを追加していますが、変数の内容を変更するだけです。

ダイナミックT-SQLの文は、文字列連結を使用して作成されていると思います。それでは、私たちはこのような何かを持っているとしましょう:

DECLARE @DynamicSQLSTatement NVARCHAR(MAX); 

DECLARE @TableName01 NVARCHAR(128) = 'T01'; 
DECLARE @TableName02 NVARCHAR(128) = 'T02'; 

DECLARE @TSQL NVARCHAR(4000) = REPLICATE(N'X', 4000); 

SET @DynamicSQLSTatement = @TableName01 + @TSQL + @TableName02; 

我々は3つのshort文字列(長さ< max)を持っており、それらが連結されているとき、我々は(新しいNVARCHAR(MAX)値はまったく新しい文字列を格納することができるであろうことを期待結局、maxの長さである)。

したがって、次の文はT02と表示されます。

SELECT RIGHT(@DynamicSQLSTatement, 3); 

ただし、出力はXXXです。ですから、連結テキスト全体が保存されないのはなぜですか?

nvarchar(1-4000)文字列を連結すると、すべてのデータを格納することができない場合、出力文字列はmaxに変換されません。

この問題を解決するために、我々はnvarchar(max)に文字列の最初の部分をキャストすることができます:あなたが長いということで動的SQL文を実行している場合

SET @DynamicSQLSTatement = CAST(@TableName01 AS NVARCHAR(MAX)) + @TSQL + @TableName02 

SELECT RIGHT(@DynamicSQLSTatement, 3); 
0

私はあなたの打撃が約16Kあなたはnvarchar(max)などが作成される前に変数に保持できるデータの最大数にする必要があります.nvarcharの代わりにvarchar(max)を使用すると、半分のサイズ(Unicodeは16ビット、ASCIIは8ビット)

あなたがしようとしていることは、実際にはそうすべきではないので、本当にこの問題を抱えています。スーパーロングSQLステートメントは記号ですあなたが間違った道を辿ったことを知っているあなたの質問や操作を分解する方法を探してください。 1つのクエリではなく、いくつかの手順でデータセットを制限することができます。

関連する問題