web-dev-qa-db-ja.com

SQL Server 2008 Management Studioでテキストまたはvarchar(MAX)列の完全なコンテンツを表示するにはどうすればよいですか?

このライブSQL Server 2008(ビルド10.0.1600)データベースには、Eventsという名前のtext列を含むDetailsテーブルがあります。 (はい、これは実際にはvarchar(MAX)列である必要がありますが、このデータベースをセットアップした人はそれをしませんでした。)

この列には、SQL Server Management Studioを介してアクセスしようとしている例外と関連JSONデータの非常に大きなログが含まれていますが、グリッドからテキストエディターに結果をコピーするたびに、43679文字で切り捨てられます。

インターネット上のさまざまな場所で、_Tools > Options > Query Results > SQL Server > Results To Grid_のXMLデータに対して取得される最大文字数をUnlimitedに設定し、次のようなクエリを実行できることを読みました。

_select Convert(xml, Details) from Events
where EventID = 13920
_

(データは列はXMLではないことに注意してください。CONVERT列をXMLに変換することは、SSMSがtextまたはvarchar(MAX)列。

ただし、上記のオプションを設定し、クエリを実行し、結果のリンクをクリックしても、次のエラーが表示されます。

XMLを表示できません。次のエラーが発生しました:予期しないファイルの終わりが発生しました。行5、位置220160。

1つの解決策は、XMLデータ用にサーバーから取得する文字数を増やすことです。この設定を変更するには、[ツール]メニューの[オプション]をクリックします。

したがって、このデータにアクセスする方法についてのアイデアはありますか?列をvarchar(MAX)に変換すると問題が解決しますか?

82
adamjford

非常に限られた状況で機能する可能性がある1つのトリックは、以下のように特別な方法で列に名前を付けるだけです。

DECLARE @S varchar(max) = 'A'

SET @S =  REPLICATE(@S,100000) + 'B' 

SELECT @S as [XML_F52E2B61-18A1-11d1-B105-00805F49916B]

SSMS 2012および2014では、次のように結果が表示されます

enter image description here

それをクリックすると、XMLビューアーで完全な結果が開きます。右にスクロールすると、Bの最後の文字が保持されていることが示されます。

ただし、これにはいくつかの重大な問題があります。クエリに追加の列を追加すると効果が壊れ、追加の行はすべて最初の行と連結されます。最後に、文字列に<などの文字が含まれている場合、XMLビューアを開くと解析エラーで失敗します。

SQL Serverが<&lt;などに変換したり、これらの文字が原因で失敗したりする問題を回避する、より堅牢な方法は次のとおりです( クレジットAdam Machanic )。

DECLARE @S varchar(max)

SELECT @S = ''

SELECT @S = @S + '
' + OBJECT_DEFINITION(OBJECT_ID) FROM SYS.PROCEDURES

SELECT @S AS [processing-instruction(x)] FOR XML PATH('')
83
Martin Smith

これを機能させることができました...

SELECT CAST('<![CDATA[' + LargeTextColumn + ']]>' AS XML) FROM TableName;
40
Scott Durbin

回避策の1つは、結果セットを右クリックして、「名前を付けて結果を保存...」を選択することです。これにより、列の内容全体を含むCSVファイルにエクスポートされます。完璧ではありませんが、私には十分に機能しました。

Workaround

17
Darky711

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

クエリウィンドウで、

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

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

Results in a file

8
Jenna Leaf

私が見つけた最も簡単な回避策は、テーブルをバックアップしてスクリプトを表示することです。これをする

  1. データベースを右クリックし、Tasks> Generate Scripts...を選択します
  2. 「紹介」ページをクリックNext
  3. 「オブジェクトの選択」ページ
    1. Select specific database objectsを選択し、テーブルを選択します。
    2. Nextをクリックします
  4. 「スクリプトオプションの設定」ページ
    1. 出力タイプをSave scripts to a specific locationに設定します
    2. Save to fileを選択し、関連するオプションを入力します
    3. Advancedボタンをクリックします
    4. General> Types of data to scriptData onlyまたはSchema and Dataに設定し、[OK]をクリックします
    5. Nextをクリックします
  5. 「概要ページ」をクリックします
  6. SQLスクリプトは、4.2で設定したオプションに基づいて生成される必要があります。このファイルを開いて、データを表示します。
4
Kevin Brydon

TEXTデータ型は古く、使用すべきではありません。TEXT列からデータを選択するのは面倒です。

ntext、text、およびimage(Transact-SQL)

ntext、text、およびimageデータ型は、Microsoft SQL Serverの将来のバージョンで削除される予定です。これらのデータ型を新しい開発作業で使用することは避け、現在それらを使用しているアプリケーションを変更することを計画してください。代わりに、nvarchar(max)、varchar(max)、およびvarbinary(max)を使用してください。

テキストデータを取得するには、 TEXTPTR(Transact-SQL) を使用する必要があります。

テキストデータタイプの処理 の記事も参照してください。

3
KM.

Xmlの形式が適切ではないようです。その場合、Xmlとしてキャストできず、Management Studioで返せるテキストの量が制限されます。ただし、次のようにテキストを小さなチャンクに分割できます。

_With Tally As
    (
        Select ROW_NUMBER() OVER ( ORDER BY s1.object_id ) - 1 As Num
        From sys.sysobjects As s1
            Cross Join sys.sysobjects As s2
    )
Select Substring(T1.textCol, T2.Num * 8000 + 1, 8000)
From Table As T1
    Cross Join Tally As T2
Where T2.Num <= Ceiling(Len(T1.textCol) / 8000)
Order By T2.Num
_

次に、それらを再度手動で結合する必要があります。

[〜#〜] edit [〜#〜]

Xmlパーサーが気に入らないtextデータにいくつかの文字があるように聞こえます。これらの値をエンティティに変換してから、Convert(xml, data)トリックを試すことができます。のようなもの:

_Update Table
Set Data = Replace(Cast(Data As varchar(max)),'<','&lt;')
_

(私はvarchar(max)にキャストする必要がありました。replace関数はtext列では機能しないためです。これらのtext列をvarchar(max)。)

2
Thomas

あなたは運が悪いと思います。この問題は、他のすべての回答が焦点を当てているように見えるSQLレベルの問題ではなく、ユーザーインターフェイスの1つにすぎません。 Management Studioは、汎用/汎用のデータアクセスインターフェイスを目的とするものではありません。インターフェイスではなく、管理領域があり、バイナリデータと大規模なテストデータの処理に重大な制限があります。指定された使用プロファイル内でそれを使用する人はこの問題に遭遇しないからです。

大きなテキストデータを提示することは、単に計画された使用法ではありません。

唯一の選択肢は、テキスト入力を取得し、行ごとに行をカットするテーブル値関数です。これにより、Management Studioは単一行ではなく行のリストを取得します。

0
TomTom

SSMS 18.2から、グリッド結果で最大200万文字を表示できるようになりました。 ソース

より多くのデータを表示(テキストへの結果)およびセルへの保存(グリッドへの結果)を許可します。 SSMSでは、両方で最大2Mの文字を使用できるようになりました。

以下のコードでこれを確認しました。

DECLARE @S varchar(max) = 'A'

SET @S =  REPLICATE(@S,2000000) + 'B' 

SELECT @S as a
0
Gabe

セルごとにSSMSで列をクリック可能にするこの単純なXMLハックが好きです。この方法を使用すると、SSMSの表形式ビューでデータをすばやく表示し、特定のセルをクリックして、興味があるときに完全な値を表示できます。これは、XMLエラーを回避することを除いて、OPの手法と同じです。

SELECT
     e.EventID
    ,CAST(REPLACE(REPLACE(e.Details, '&', '&amp;'), '<', '&lt;') AS XML) Details
FROM Events e
WHERE 1=1
AND e.EventID BETWEEN 13920 AND 13930
;
0
binki