web-dev-qa-db-ja.com

テーブル内から大きなテキストを取得する方法は?

自分のレコードの場合、自分のアクティビティとスクリプトを保存するサーバーの1つにテーブルがあります

テーブル定義は次のとおりです。

IF OBJECT_ID('[dbo].[activity]') IS NOT NULL 
DROP TABLE [dbo].[activity] 
GO
CREATE TABLE [dbo].[activity] ( 
[dt]        DATE                             NOT NULL,
[i]         SMALLINT                         NOT NULL,
[activity]  NVARCHAR(max)                     NOT NULL,
[script]    NVARCHAR(max)                     NULL  
           CONSTRAINT [DF__activity__script__6E01572D] DEFAULT (NULL))

GO
CREATE CLUSTERED INDEX [pk_activity] 
   ON [dbo].[activity] ([dt] desc, [i] desc)

このテーブルはDBA_SERVERサーバーのDBAデータベースにあるため、ローカルマシンからlinked serverDBA_SERVERに作成して、スクリプトをテーブル。

これがスクリプトをテーブルに挿入する方法です。スクリプトはローカルマシンにあります。

    INSERT INTO [MY_DBA_SERVER].[DBA].[dbo].[activity]
               ([dt]
               ,[i]
               ,[activity]
               ,[script])
    SELECT
               DT=cast ('3 may 2018' as date)
               ,I=1100
               ,ACTIVITY='MOVE APPLICATION ROWS - the Ids work'
               ,[script]=BulkColumn 
    FROM Openrowset( Bulk 'C:\Users\MMiorelli\Downloads\applicationID consolidated.sql', 
                     Single_Blob) as [the script]

そして、これは問題なく動作しているようです。

SELECT [dt]
      ,[i]
      ,[activity]
      ,[script]
  FROM [MY_DBA_SERVER].[DBA].[dbo].[activity]
GO

挿入したばかりのものがテーブルにあることがわかります。 enter image description here

次のスクリプトを実行すると、各フィールドのデータ量がわかります。

SELECT [dt]
      ,[i]
      ,[activity]
      ,[script]
      ,len_activity=DATALENGTH( [activity])
      ,len_script=DATALENGTH( [script])
  FROM [MY_DBA_SERVER].[DBA].[dbo].[activity]
GO

そしてそれは私にこれを与えます:

enter image description here

私の問題は、スクリプトのコンテンツ全体を取得できないことです。下の画像でわかるように、マウスを使用してコピーしようとしました。

enter image description here

しかし、私は非常に長い毛むくじゃらのスクリプトをいくつか持っています。

私の質問は:

このscriptをテーブルから取得するにはどうすればよいですか?

選択するか、ファイルに保存することもできますが、可能であればT-SQLを使用することをお勧めします。

好奇心だけでも画像と同じでしょうか?

3

次の回答で提供されているストアドプロシージャ(ここではDBA.SE)を使用して、これを実行できるはずです。

sqlcmdで4000文字を超える出力方法

NVARCHAR(MAX)を使用しているため、その回答の下部にある、PastebinにあるそのストアドプロシージャのNVARCHARバージョンへのリンクがあるメモを参照してください。

どちらの場合でも、ストアドプロシージャはNVARCHARの4000または8000文字の制限(それぞれVARCHARまたはPRINTに依存)を回避するために、出力をチャンクで出力します。切り捨てに気付かないはずですが、改行などが期待どおりに機能するはずです。これは、結果グリッドからコピー/貼り付けするときに発生しません。

2
Solomon Rutzky

データが切り捨てられるため、テキスト出力からコピーすることはできません。

グリッド出力からコピーすることはできません。データが切り捨てられるだけでなく、キャリッジリターン、ラインフィード、およびその他の制御文字も処理されます。

その列をmightでXMLに変換し、ダブルクリックしてデータを新しいタブに表示できます。ここではこれについて説明しますが、目的は異なります。

基本的に、SSMSは目的のタスクを実行するように作成されていません。ファイルに抽出することもできますが、そのプロセス中に同様の切り捨てが発生する可能性はかなり高くなります。

あなたの最善の策は、PowershellまたはC#からデータをプルして、出力をファイルに書き込むことです。

3
Aaron Bertrand

Aaronに似た別の方法があり、ほとんど文書化されていないprocessing-instruction...を使用します。

これを使用すると、未定義のXMLが提供されます。これにより、事前定義されたエンティティは置き換えられません。

また、列の最初と最後にXML識別マークが付けられます。これは、出力の使用方法によっては別の欠点となる場合があります。

しかし、クリック感があり、全体を表示します。

CREATE TABLE dbo.LongText ( 
    Id INT IDENTITY, 
    LongText_N NVARCHAR(MAX), 
    LongText_X XML  
    );

INSERT dbo.LongText ( LongText_N, LongText_X )
SELECT asm.definition, (SELECT asm.definition AS [processing-instruction(_)] FOR XML PATH(''))
FROM sys.all_sql_modules AS asm

SELECT * FROM dbo.LongText AS lt
2
Erik Darling