9

MS SQL Server 2005 のストアド プロシージャを .sql ファイルに自動的に保存したい (.bat 経由で呼び出せるツールが望ましい) ため、sproc を 1 つずつ手動でクリックして保存する必要はありません。

私はすでに devio IT から SMOscript を見つけましたが、すべてのテーブルと sproc を収集するのに時間がかかります。どの sproc をエクスポートするかを定義できる同様のツールはありますか? また、CREATE のスクリプト sproc として手動でエクスポートするのとは対照的に、SMOScript がエクスポートされたファイルに追加しない USE 句がありません。

よろしくショーン

4

7 に答える 7

1

SET NOCOUNT ON を追加すると、確かに line_del.bat が不要になりましたが、syscomments を sys.sql_modules に置き換えると、各ストアド プロシージャが 258 文字に切り捨てられました。したがって、最良の結果を得るために、私が使用したコードは次のとおりです。

sqlcmd -E -S SERVER-d DB -h-1 -Q "SET NOCOUNT ON SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt"
for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER-d DB -h-1 -Q "SET NOCOUNT ON SELECT text from dbo.syscomments WHERE id = OBJECT_ID('%%a')" -o "%%a.sql"

これは機能し、line_del.bat を使用する必要はありませんでした。SSMS ウィザード (タスク/スクリプトの生成/ストアド プロシージャ/すべて選択) を使用して手動でエクスポートしたときに得られなかったものは次のとおりです。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

各 .sql の先頭、および末尾の GO コマンドにも。それほど重要ではありませんが、注意すべきことがあります。Max Gontar、Seansilver、Lee の貢献に感謝します。データベース内のストアド プロシージャのバックアップを自動化し、バージョン管理を適用できるようになりました。

于 2011-08-02T13:38:44.877 に答える
0

line_del.bat が不要になるように SET NOCOUNT ON を追加しました。また、syscomments を sys.sql_modules に置き換えました (SQL 2005)。OBJECT_DEFINITION 関数を使用することもできましたが、sys.sql_modules よりも低速でした。

sqlcmd -E -S SERVER -d DB -h-1 -Q "SET NOCOUNT ON SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt" for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER -d DB -h-1 -Q "SET NOCOUNT ON SELECT definition from sys.sql_modules WHERE object_id = OBJECT_ID('%%a')" -o "%%a.sql"
于 2009-05-07T15:53:18.133 に答える
0

user, pass の代わりに sqlcmd と -E を使用しました。これは今のところ問題なく動作します。4000 文字を超えるストアド プロシージャだけが改行されます。

sqlcmd -E -S SERVER -d DB -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt"
call line_del sp_list.txt "rows affected"
call line_del sp_list.txt "row affected"
for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER -d DB -h-1 -Q "SELECT text from dbo.syscomments WHERE id = OBJECT_ID('%%a')" -o "%%a.sql"
for /f %%a in (sp_list.txt) do call line_del %%a.sql "rows affected"
for /f %%a in (sp_list.txt) do call line_del %%a.sql "row affected"

よろしくショーン

于 2009-02-24T09:41:56.100 に答える
0

上記のすべての助けに感謝し、私のような他のsqlcmd初心者が見つけられるようにこれをここに残してください. SQL Server 2005 で動作します。objectName はプロシージャ、ビューなどの名前です。

:reset

-- :setvar ObjectName "objectName"  -- works
:setvar ObjectName objectName  -- works too
declare @sql varchar(max);
set @sql = 'select text from dbo.syscomments where id = object_id(upper("' + '$(ObjectName)' + '"))';
-- exec sp_helptext $(ObjectName)  -- quick n easy but gets chopped to 256 width
/*   4000 byte limit
set @sql = 
   'select view_definition 
    from information_schema.views 
    where upper(table_name) = upper("' + '$(ObjectName)' + '")';
*/
:out $(ObjectName).sql

exec(@sql)
go

:out stdout
于 2011-10-07T05:31:26.547 に答える