このライブ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)
に変換すると問題が解決しますか?
非常に限られた状況で機能する可能性がある1つのトリックは、以下のように特別な方法で列に名前を付けるだけです。
DECLARE @S varchar(max) = 'A'
SET @S = REPLICATE(@S,100000) + 'B'
SELECT @S as [XML_F52E2B61-18A1-11d1-B105-00805F49916B]
SSMS 2012および2014では、次のように結果が表示されます
それをクリックすると、XMLビューアーで完全な結果が開きます。右にスクロールすると、Bの最後の文字が保持されていることが示されます。
ただし、これにはいくつかの重大な問題があります。クエリに追加の列を追加すると効果が壊れ、追加の行はすべて最初の行と連結されます。最後に、文字列に<
などの文字が含まれている場合、XMLビューアを開くと解析エラーで失敗します。
SQL Serverが<
を<
などに変換したり、これらの文字が原因で失敗したりする問題を回避する、より堅牢な方法は次のとおりです( クレジット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('')
これを機能させることができました...
SELECT CAST('<![CDATA[' + LargeTextColumn + ']]>' AS XML) FROM TableName;
私が見つけた最も簡単な回避策は、テーブルをバックアップしてスクリプトを表示することです。これをする
Tasks
> Generate Scripts...
を選択しますNext
Select specific database objects
を選択し、テーブルを選択します。Next
をクリックしますSave scripts to a specific location
に設定しますSave to file
を選択し、関連するオプションを入力しますAdvanced
ボタンをクリックしますGeneral
> Types of data to script
をData only
またはSchema and Data
に設定し、[OK]をクリックしますNext
をクリックしますTEXTデータ型は古く、使用すべきではありません。TEXT列からデータを選択するのは面倒です。
ntext、text、およびimage(Transact-SQL)
ntext、text、およびimageデータ型は、Microsoft SQL Serverの将来のバージョンで削除される予定です。これらのデータ型を新しい開発作業で使用することは避け、現在それらを使用しているアプリケーションを変更することを計画してください。代わりに、nvarchar(max)、varchar(max)、およびvarbinary(max)を使用してください。
テキストデータを取得するには、 TEXTPTR(Transact-SQL) を使用する必要があります。
テキストデータタイプの処理 の記事も参照してください。
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)),'<','<')
_
(私はvarchar(max)にキャストする必要がありました。replace関数はtext
列では機能しないためです。これらのtext
列をvarchar(max)
。)
あなたは運が悪いと思います。この問題は、他のすべての回答が焦点を当てているように見えるSQLレベルの問題ではなく、ユーザーインターフェイスの1つにすぎません。 Management Studioは、汎用/汎用のデータアクセスインターフェイスを目的とするものではありません。インターフェイスではなく、管理領域があり、バイナリデータと大規模なテストデータの処理に重大な制限があります。指定された使用プロファイル内でそれを使用する人はこの問題に遭遇しないからです。
大きなテキストデータを提示することは、単に計画された使用法ではありません。
唯一の選択肢は、テキスト入力を取得し、行ごとに行をカットするテーブル値関数です。これにより、Management Studioは単一行ではなく行のリストを取得します。
SSMS 18.2から、グリッド結果で最大200万文字を表示できるようになりました。 ソース
より多くのデータを表示(テキストへの結果)およびセルへの保存(グリッドへの結果)を許可します。 SSMSでは、両方で最大2Mの文字を使用できるようになりました。
以下のコードでこれを確認しました。
DECLARE @S varchar(max) = 'A'
SET @S = REPLICATE(@S,2000000) + 'B'
SELECT @S as a
セルごとにSSMSで列をクリック可能にするこの単純なXMLハックが好きです。この方法を使用すると、SSMSの表形式ビューでデータをすばやく表示し、特定のセルをクリックして、興味があるときに完全な値を表示できます。これは、XMLエラーを回避することを除いて、OPの手法と同じです。
SELECT
e.EventID
,CAST(REPLACE(REPLACE(e.Details, '&', '&'), '<', '<') AS XML) Details
FROM Events e
WHERE 1=1
AND e.EventID BETWEEN 13920 AND 13930
;