1. ホーム
  2. sql-server

[解決済み] SQL Server 2008 Management Studio で text または varchar(MAX) カラムの完全なコンテンツを表示するにはどうすればよいですか?

2022-12-10 02:46:41

質問

このライブの SQL Server 2008 (ビルド 10.0.1600) データベースに Events テーブルがあり、このテーブルには text という名前のカラムがあります。 Details . (そうです、私はこれが実際には varchar(MAX) カラムであるべきなのですが、このデータベースを設定した人がそのようにしなかったのです)。

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

インターネット上のさまざまな場所で、XML データに取得される最大文字数を Tools > Options > Query Results > SQL Server > Results To Grid をUnlimitedに設定し、以下のようなクエリを実行するとのことです。

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

(なお、data is columnは全くXMLではありません。 CONVERT からデータを取得する際の SSMS の制限を回避するために、他の誰かが使っているのを私がググって見つけた回避策に過ぎないのですが、このカラムを XML に変換しています。 text または varchar(MAX) の列のいずれかです)。

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

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

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

では このデータにアクセスする方法について何か考えがありますか? カラムを varchar(MAX) に変換することで、私の苦境を解決できますか?

どのように解決するのですか?

SSMS では、XML データに対してのみ無制限のデータを許可しています。これはデフォルトではないので、オプションで設定する必要があります。

非常に限定された状況で機能するかもしれない1つのトリックは、単に以下のように特別な方法でカラムを命名し、XMLデータとして扱われるようにすることです。

DECLARE @S varchar(max) = 'A'

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

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

SSMS (少なくともバージョン2012から18.3まで) では、以下のように結果が表示されます。

クリックすると、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('')