2012-08-23 17 views
13

私はこれをやろうとしている:文字列を格納する方法var varchar(max)より大きい?

DECLARE @myVar VARCHAR(MAX) 
Loop with cursor 
select @myVar = @myVar + bla bla bla 
end loop 

ループが終了すると、@myvarのみ8000文字を含む、不完全です。

テキストを使用しようとしましたが、ローカル変数には使用できません。

この場合、どのような良い解決策がありますか?

xml var?

は、私はこの記事を見てきました:

How do I pass a string parameter greater than varchar(8000) in SQL Server 2000?

Check if concatenating to a varchar(max) will go beyond max allowable characters

などをWeb経由で。

よろしくお願いいたします。真剣

+3

'varchar(max) 'より大きい?それは2GBのデータです - それは200億倍以上です**レオ・トルストイの戦争と平和*小説全体のサイズ**とそれはあなたのために十分ではありませんか? * –

+1

@marc_s:質問には、ポスターの変数がループの最後に8000文字しか含まれていないことが尋ねられているようです。私はタイトルが誤解を招くと思います。おそらくここで尋ねられていることを明確にするためにポスターを編集することができます。 –

+0

@KenWhite:この問題を解決する方法については、私の回答を参照してください。 –

答えて

26

からVARCHAR(MAX)は、データの2ギガバイトまで保存することができます - だけではなく、8000文字.....

この試してみてください。これは、8000文字より高い値を返します

DECLARE @myVar VARCHAR(MAX) = '' 

DECLARE @ix INT = 1 

WHILE @ix < 1000 
BEGIN 
    set @myVar = @myVar + CAST('bla bla bla' AS VARCHAR(MAX)) 
    SET @ix = @ix + 1 
END 

SELECT DATALENGTH(@myvar) 

を1000回繰り返した後。

ポイントは次のとおりです。あなたがvarchar(max)を使用している場合、あなたは、常にを確認する必要があり、明示的にvarchar(max)すべての文字列をキャスト - 私はこの例で行ったように。さもなければ、SQL Serverは "普通の" varcharの処理に戻り、実際には8000文字に制限されます。

+1

これは明示的なキャストなしで私のために正常に動作します。 REPLICATEのような組み込み関数を使用するときは注意が必要です。 –

+0

これを試してみます。 – Eduardo

+1

@AaronBertrand:ああ...興味深い - はい - それはちょうどうまく動作するように見える - キャストなしでも....うーん.... –

関連する問題