自分のレコードの場合、自分のアクティビティとスクリプトを保存するサーバーの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 server
をDBA_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
次のスクリプトを実行すると、各フィールドのデータ量がわかります。
SELECT [dt]
,[i]
,[activity]
,[script]
,len_activity=DATALENGTH( [activity])
,len_script=DATALENGTH( [script])
FROM [MY_DBA_SERVER].[DBA].[dbo].[activity]
GO
そしてそれは私にこれを与えます:
私の問題は、スクリプトのコンテンツ全体を取得できないことです。下の画像でわかるように、マウスを使用してコピーしようとしました。
しかし、私は非常に長い毛むくじゃらのスクリプトをいくつか持っています。
私の質問は:
このscript
をテーブルから取得するにはどうすればよいですか?
選択するか、ファイルに保存することもできますが、可能であればT-SQLを使用することをお勧めします。
好奇心だけでも画像と同じでしょうか?
次の回答で提供されているストアドプロシージャ(ここではDBA.SE)を使用して、これを実行できるはずです。
NVARCHAR(MAX)
を使用しているため、その回答の下部にある、PastebinにあるそのストアドプロシージャのNVARCHAR
バージョンへのリンクがあるメモを参照してください。
どちらの場合でも、ストアドプロシージャはNVARCHAR
の4000または8000文字の制限(それぞれVARCHAR
またはPRINT
に依存)を回避するために、出力をチャンクで出力します。切り捨てとに気付かないはずですが、改行などが期待どおりに機能するはずです。これは、結果グリッドからコピー/貼り付けするときに発生しません。
データが切り捨てられるため、テキスト出力からコピーすることはできません。
グリッド出力からコピーすることはできません。データが切り捨てられるだけでなく、キャリッジリターン、ラインフィード、およびその他の制御文字も処理されます。
その列をmightでXMLに変換し、ダブルクリックしてデータを新しいタブに表示できます。ここではこれについて説明しますが、目的は異なります。
基本的に、SSMSは目的のタスクを実行するように作成されていません。ファイルに抽出することもできますが、そのプロセス中に同様の切り捨てが発生する可能性はかなり高くなります。
あなたの最善の策は、PowershellまたはC#からデータをプルして、出力をファイルに書き込むことです。
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