次のコマンドを実行すると、次のようになります。
DBCC SHRINKFILE('MyDB_log', 1)
SSMSでは次の結果が得られます。
DBID | Field | CurrentSize | MinimumSize | UsedPages | Estimated Pages
-----|-------|-------------|-------------|-----------|----------------
11 | 2 | 128 | 128 | 128 | 128
質問:
SSMS出力ウィンドウを使用せずに、これらの結果をテキストファイルに出力するクエリを作成するにはどうすればよいですか。
私はこれを試しました:
CREATE TABLE #x
(
[DBID] int,
FileID int,
CurrentSize int,
MinimumSize int,
UsedPages int,
EstimatedPages int
)
INSERT #x
EXEC('DBCC SHRINKFILE(''MyDB_log'', 1)')
SELECT *
FROM #x
DROP TABLE #x
しかし、次のエラーが発生します。
Msg 8920, Level 16, State 2, Line 1
Cannot perform a shrinkfile operation inside a user transaction. Terminate the transaction and reissue the statement.
私も次のことを試しました:
DECLARE @Statement AS VARCHAR(2000);
SET @Statement = 'bcp "DBCC SHRINKFILE(''MyDB_log'', 1)" queryout C:\Test.txt -c -UDBAdmin -P1234 -S192.168.123.123';
exec xp_cmdshell @Statement
私は得る:
Error = [Microsoft][SQL Native Client]BCP Host-files must contain at least one column
私が見る最も簡単な方法は、sqlcmdを使用したバッチファイルです。
sqlcmd -S .\SQL2008R2 -E -Q "dbcc loginfo" >> log.txt
リダイレクト演算子は、ファイルの最後にデータを追加します。
-Qパラメーターは、sqlcmdセッションをすぐに閉じるために使用されました。
1回限りのクエリを表示している場合は、Ctrl + Shift + Fを押すと、クエリ結果をファイルに出力できます。
自動化できるものを探している場合は、Powershellまたは別のスクリプト言語でクエリをラップし、ファイルを書き込むことができます。
十分に単純な2つのオプションがあります。リンクサーバーまたはSQLCLRのいずれかを使用します。
リンクサーバー
このオプションには3つのものが必要です。
リンクサーバーの_'remote proc transaction promotion'
_プロパティをfalse
に設定することで、SQLServerがMSDTCを使用してローカルアクションとリモートアクションを1つのトランザクションに結び付けようとするのを防ぎます。
リンクサーバーの_'rpc out'
_プロパティをtrue
に設定して、DBCC
によって返された結果セットをローカルコンテキストに戻すことができるようにします。
EXEC('DBCC...') AT [LinkedServerName];
を介してリンクサーバーを使用すること
このアプローチの実用的な例については、次の私の回答(DBA.SEにもあります)を参照してください。
DBCC SHRINKFILEの結果をテーブルに保存するにはどうすればよいですか?
[〜#〜] sqlclr [〜#〜]
Enlist
接続文字列キーワードがfalse
に設定されている通常の/外部接続(つまり、コンテキスト接続ではない)を使用して、SQLCLRストアドプロシージャまたはスカラー関数/ UDFのいずれかを作成できます。 _'remote proc transaction promotion'
_が無効になっているリンクサーバーの場合と同様に、_Enlist = false;
_との新しい接続では、ローカルトランザクションとリモートトランザクションをバインドしようとはしません。
UDFはセットベースの操作での使用に適していますが、最も簡単なアプローチ(私は信じていますが、テストはしていません)は、SqlCommand.ExecuteReader()
(ここでSqlCommand
オブジェクトは、DBCC
)からSqlContext.Pipe.Send()
への呼び出しです。