一見単純なリクエストがあります。この基準に従って、データベース内のすべてのストアドプロシージャをスクリプト化する必要があります。
次のようにprocが存在する場合、スクリプトにはドロップを含める必要があります...
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[myproc]') AND type in (N'P', N'PC'))
スクリプトにsp_executesqlを含めることはできないため、このようなものはありません...
EXEC dbo.sp_executesql @statement = '....'
ストアドプロシージャごとに個別のスクリプトファイルが必要です。したがって、[ストアドプロシージャ名].sqlになります
組み込みのSQL生成スクリプトを試してみると、別のファイルのオブジェクトをスクリプト化するためのチェックボックスを介して別のファイルのprocを取得でき、ifexistsドロップも取得できます。ただし、不要なsp_executesqlを使用します。
だから私はSMOを少し試してみて、同様の問題を見つけました...
A.残念ながら、以下はdropステートメントのみをスクリプト化したものです。それをクリエイトと組み合わせる方法はありません。したがって、個別のファイルを取得でき、sp_executesqlは取得できませんが、上記の#1がまだ欠落しています。
Scripter scripter = new Scripter();
scripter.Options.ScriptDrops = true;
B.次に、次のオプションは、sp_executesqlを使用するように出力を変更します
scripter.Options.IncludeIfNotExists = true;
C.最後に、テキストを手動で追加できます。TextHeaderに正常に設定されています。ただし、scripter.Script()は例外 "{" Script failed forStoredProcedure'dbo.myproc'をスローします。"}
storedProcedure.TextHeader = string.Format("IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'{0}') AND type in (N'P', N'PC')) \r\nDROP PROCEDURE {0} \r\nGO\r\n{1}", storedProcedure.Name, storedProcedure.TextHeader);
scripter.Options.FileName = Path.Combine(storedProceduresPath, storedProcedure.Name + ".sql");
scripter.Script(new Urn[] { storedProcedure.Urn }); //Exception! - Script failed for StoredProcedure
これがそんなに奇妙なことだとは想像できないので、人々がこれをどのように達成しているのだろうか?sql --tasks --generateスクリプトを使用して個別のファイルを作成する必要がある場合は悲しいです。その後、不要な「EXEC dbo.sp_executesql @statement =N'」をクリアするアプリが続きます。