web-dev-qa-db-ja.com

SQL Serverの切り捨てと8192の制限

SQL Server 2005では、8192を超えるテキストデータを持つ行を持つvarchar(MAX)列を照会しようとしています。しかし、Management Studioでは、ツール->オプション->クエリ結果- ->テキストへの結果->各列に表示される最大文字数= 8192、これは最大です。したがって、これらの行の切り捨ては、テキスト出力によって課される制限のためにのみ発生するようです。

これを回避する唯一の方法は、SUBSTRING関数を使用して、最初の8000文字、次に8000文字などを取得することです。しかし、これは見苦しく、エラーが発生しやすくなります。

SSISとBCPは私にとって選択肢ではないことに言及する必要があります。

誰にも良い提案がありますか?ありがとう!

48
Ash Machine

データは、切り捨てられないフラットファイルにエクスポートできます。これをする:

  1. データベースを右クリック
  2. [タスク]-> [データのエクスポート]をクリックします
  3. データソースを選択します(デフォルトで問題ありません)
  4. 宛先タイプに「フラットファイル宛先」を選択します。
  5. 出力用のファイル名を選択します。
  6. [テーブルコピーまたはクエリの指定]で、[クエリを記述して転送するデータを指定する]を選択します。
  7. クエリに貼り付けます

残りの手順は自明である必要があります。これにより、ファイルがテキストに出力され、お気に入りのテキストエディターで開くことができます。

67
Torre Lasley

私もXMLを使用していますが、 わずかに異なる方法 は、XMLエンティシエーションに関するほとんどの問題を回避します。

declare @VeryLongText nvarchar(max) = '';

SELECT top 100 @VeryLongText = @VeryLongText + '

' + OBJECT_DEFINITION(object_id) 
FROM sys.all_objects 
WHERE type='P' and is_ms_shipped=1

SELECT LEN(@VeryLongText)

SELECT @VeryLongText AS [processing-instruction(x)] FOR XML PATH('')

PRINT @VeryLongText /*WILL be truncated*/

SSMSの「XMLデータ」制限が十分に高く設定されていることを確認してください!

Screenshot

28
Martin Smith

私の解決策は少しラウンドアバウトでしたが、そこに着きました (出力が65535文字未満である限り)

  1. SQL Management Studioで、グリッド結果の制限を65535に設定します([ツール]> [オプション]> [クエリ結果]> [SQL Server]> [グリッドへの結果]> [非XMLデータ)]
  2. クエリを実行し、グリッドに出力します
  3. 結果を右クリックし、「名前を付けて保存...」を選択して、結果をファイルに保存します
  4. ファイルをメモ帳などで開き、出力を取得します

[〜#〜] update [〜#〜]:これが機能することを示すために、1つの100,000文字の列を選択するSQLを次に示します。グリッド出力をcsvファイルに保存すると、100,000文字すべてが切り捨てられません。

DECLARE @test nvarchar(MAX), @i int, @line nvarchar(100)
SET @test = ''; SET @i = 100
WHILE @i < 100000
BEGIN
    SET @test = @test + STUFF(REPLICATE('_', 98) + CHAR(13) + CHAR(10), 1, LEN(CAST(@i AS nvarchar)), CAST(@i AS nvarchar))
    SET @i = @i + 100
END
SELECT @test

ノート:

  1. 私が当初考えていたように、文字の長さの設定は何の違いももたらさないようです。
  2. SQL 2008 R2(サーバーとManagement Studioの両方)を使用しています
  3. 長い列がローカル変数に保存されている場合(この例のように)、または実際のテーブルから選択されている場合、違いはないようです。
6
Luke Sampson

私はXMLをエクスポートしようとしてこれに遭遇しました。これは私が使用したソリューションです:

[グリッドへの結果]オプションを選択し、[結果]ペインに表示されるリンクを右クリックし、[結果に名前を付けて保存]を選択し、[すべてのファイル]ファイルタイプを選択し、ファイルに名前を付けて[保存]をクリックします。すべてのxmlデータがファイルに正しく保存されます。

SSMS 10を使用していますが、Torreのソリューションが機能しませんでした。エクスポートウィザードは、入力列がイメージであると考え続けました。

「入力列「XML_F52E2B61-18A1-11d1-B105-00805F49916B」(26)」のデータ型はDT_IMAGEです

4
Cindy Conway

この簡単な解決策を試しましたか?たった2クリックで!

クエリウィンドウで、

  1. クエリオプションを「グリッドへの結果」に設定し、クエリを実行します
  2. グリッドコーナーの結果タブを右クリックし、結果をファイルとして保存します

ファイルに表示したいすべてのテキストを取得します!!! varchar(MAX)フィールドの結果には130,556文字が表示されます

Just Two Clicks away!

3
Jenna Leaf

SSMSでは、行からデータを選択した場合、少数の文字に制限されますが、行からデータを編集した場合、完全な値がそこに表示されます。常にそこにあるとは限りませんが、ctrl-a、ctrl-cをエディターに貼り付けると、すべてそこにあります。

1
Larry K

通常、XMLを使用して、出力として巨大なデバッグ文字列を取得します(Lukeのテストハーネスを使用)。

    declare @test nvarchar(max), @i int, @line nvarchar(100)
    set @test = ''; set @i = 100
    while @i < 100000
    begin
        set @test = @test + stuff(replicate('_', 98) + char(13) + char(10), 1, len(cast(@i as nvarchar)), cast(@i as nvarchar))
        set @i = @i + 100
    end
    -- ctrl+d for "results to grid" then click the xml output
    --select cast('<root>' + @test + '</root>' as xml)

-- revised
select @test for xml path(''), type;
0
Nathan Skerl

選択肢が与えられた場合、クエリは「For XML Auto」または「For XML Raw」または「For XML explicit」としてデータを返すため、制限がはるかに高くなり、出力結果をさらに活用できます。

0
Avitus

別の回避策は、このトリッキーなクエリに HeidiSql を使用します。フィールド長に制限はありません。

0
cpsaez

あなたが話している切り捨ては、Management Studioでのみ発生します。列を別のアプリにプルしても、切り捨てられません。

Query Analyzerを使用してSQL Server 2005と通信する方法はありません。ManagementStudioを意味しますか?

0
Joel Coehoorn