web-dev-qa-db-ja.com

DBCCShrinkFileの結果を保存する

次のコマンドを実行すると、次のようになります。

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
3
Onion-Knight

私が見る最も簡単な方法は、sqlcmdを使用したバッチファイルです。

sqlcmd -S .\SQL2008R2 -E -Q "dbcc loginfo" >> log.txt

リダイレクト演算子は、ファイルの最後にデータを追加します。

-Qパラメーターは、sqlcmdセッションをすぐに閉じるために使用されました。

2
Marian

1回限りのクエリを表示している場合は、Ctrl + Shift + Fを押すと、クエリ結果をファイルに出力できます。

自動化できるものを探している場合は、Powershellまたは別のスクリプト言語でクエリをラップし、ファイルを書き込むことができます。

1
cfradenburg

十分に単純な2つのオプションがあります。リンクサーバーまたはSQLCLRのいずれかを使用します。

リンクサーバー

このオプションには3つのものが必要です。

  1. リンクサーバーの_'remote proc transaction promotion'_プロパティをfalseに設定することで、SQLServerがMSDTCを使用してローカルアクションとリモートアクションを1つのトランザクションに結び付けようとするのを防ぎます。

  2. リンクサーバーの_'rpc out'_プロパティをtrueに設定して、DBCCによって返された結果セットをローカルコンテキストに戻すことができるようにします。

  3. 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()への呼び出しです。

0
Solomon Rutzky