web-dev-qa-db-ja.com

プロシージャ内で8000文字を超えるとvarchar(MAX)テキストが途切れる

データ型varchar(MAX)の変数を宣言した手順があります。

declare @str varchar(MAX);

set @str='select * from Table1...'

print (@str);
exec (@str);

しかし、@ str内に書き込まれたテキストが8000文字(つまり8193文字)を超えると、文字列が切り捨てられて8000文字のみが出力され、実行するとエラーが発生します。

いくつかの検索後に2つの解決策を試しましたが、うまくいきません。

1)「varchar(MAX)」という同じ型の2つの変数を使用してみましたが、実行時にそれを連結しましたが、機能しません。

2)連結する前に両方の変数を「varchar(MAX)に再度キャスト」してから実行しようとしましたが、これも機能しません。

5
Priyank Pahuja

SSMSは、デフォルトでは8000文字を超えるvarcharを表示できません。

ただし、最大2GBのvarchar(max)値をstoreできます。

8,000文字のチャンクサイズを使用して、ループを設定し、@strデータの「チャンク」を表示できます。

この回答 は、メモリ内の@str値の実際の長さを確認する方法を示します。

そして このMSDN記事 は実行について説明しています。特に:

SQL Serverの以前のバージョンでは、文字列は8,000バイトに制限されていました。これには、動的実行のために大きな文字列を連結する必要があります。 SQL Server 2005では、varchar(max)およびnvarchar(max)データ型を指定して、文字列を最大2ギガバイトのデータにすることができます。

これは、受け取ったエラーが何か別のものであり、@str値の切り捨て操作の結果ではないことを意味します。

9
CaM