web-dev-qa-db-ja.com

すべてのユーザー定義関数をローカルハードドライブのtxtファイルに保存するにはどうすればよいですか?

SQL Server 2008を実行していて、作成したUDFスクリプト/クエリをバックアップする必要があります。これはどのようにタイムリーに行うことができますか? UDFが保存されているフォルダーアイコン(テーブル値関数)を右クリックして、フォルダーをコピーしようとしましたが、ベールにはなりませんでした。

私が思いつくことができる唯一のことは、UDFが1つ1つすべてのスクリプトでMODIFYコマンドを使用し、個別のテキストファイルにコピーして貼り付けることです。

すべてのスクリプトを個別のtxtファイルではなく1つのテキストファイルに保存する簡単な方法しかない場合でも、すべてのファイルを一度に1つずつコピーして貼り付ける必要はなく、喜んでそれを実行できます。

助言がありますか?

5
Juan Velez

SSMS(SMO経由)を使用すると、カテゴリー(関数)レベルでスクリプトを作成できます。テーブル値関数のみを指定することはできません。

enter image description here

enter image description here

enter image description here

PSを使用して作成を自動化するために、次のようなものも確認できます article 。スクリプト化されているオブジェクトを関数タイプ(tvf、スカラーなど)でフィルタリングできる場合があります。

4
billinkc

私が考えることができる最も簡単な方法は次のとおりです:

  1. データベースを右クリック->タスク->スクリプトを生成...
  2. 特定のデータベースオブジェクトを選択します
  3. チェックボックスを選択ユーザー定義関数
  4. ファイルに保存し、テキストファイルに任意の名前を付けます

これにより、UDFのスクリプトが生成され、目的のファイルに保存されます。 PowerShell(頭上から)を使用して、各UDFのスクリプトを生成し、それらを個別のテキストファイル(UDFごとに1つのテキストファイル)に保存できます。

編集:以下は、やりたいことを行うためのPowerShellです。このスクリプトは、データベース内のすべてのユーザー定義関数を取得し(変数を適切な環境に設定)、それぞれの定義を独自のファイルに書き込み、関数の名前をファイルに付けます。

$serverName = "YourServerName"          # example: "YourServer" or "YourServer\YourNamedInstance"
$databaseName = "YourDatabaseName"
$outputDirectory = "C:\Dir1\YourUDFs"   # the dir you want these files saved in

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null

$server = New-Object Microsoft.SqlServer.Management.Smo.Server($serverName)
$database = $server.Databases.Item($databaseName)
$udfCol = $database.UserDefinedFunctions | Where-Object {$_.Schema -ne "sys"}
foreach ($udf in $udfCol) {
    $udfName = $udf.Name
    ($udf.TextHeader + $udf.TextBody) | 
        Out-File -FilePath $outputDirectory\$udfName".txt"
}
8
Thomas Stringer

方法1

オブジェクトエクスプローラーで、[サーバー] => [データベース] =>プログラミング=>関数を展開し、適切な[関数タイプ]を強調表示します(例:スカラー値関数)。

オブジェクトエクスプローラーの詳細(F7)を開きます。

右側のペインで、すべての関数を選択し、右クリックして、[スクリプト関数As => CREATE To => File]を右クリックします。

このメソッドをすべての関数型に同時に使用できるとは思いません。


方法2

これはもう少し手作業ですが、次のようなクエリを使用して、メタデータを独自のスクリプトに入れ、すべての関数を同じように処理できます(必ずテキストに結果を使用してください)。

SET NOCOUNT ON;

SELECT m.definition + 'GO'
  FROM sys.sql_modules AS m
  INNER JOIN sys.objects AS o
  ON m.[object_id] = o.[object_id]
  WHERE o.type IN ('FN', 'IF', 'TF');

多くの機能がある場合、SSMSと同じ表示制限のないアプリケーションから使用すると、よりうまく機能します。


方法

SMO、PowerShellなどを調べます。

6
Aaron Bertrand