kazuk は null に触れてしまった

C# / .NET 系技術ネタ縛りでお送りしております

SQLサーバに登録されたストアドを展開する為の T4 テンプレート


表題の物のおすそ分けです。

SQLサーバに登録されているストアドを展開先DBに drop create で登録するSQLファイルを書き出してくれます。また再登録を行ったストアドの一覧と展開先での登録の突き合わせを行い、更新対象にならなかったストアドが有れば(前のバージョンでは存在したが現バージョンで存在しない物、展開元への登録忘れか要らなくなった物が残ってる)結果セットとして表示します。

使い方としては欲しいSQLのファイル名+拡張子 tt でプロジェクト内に保存して Visual Studio からカスタムツールの実行だけです。

こういう網羅性とか正確さが必要な事は絶対に手でやっては駄目で、必要な事を淡々とやってくれる機械に任せるのが一番だったりします。

 

<#@ template language="C#v3.5" debug="true" hostSpecific="true" inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" #>
<#@ output extension=".sql" encoding="shift-jis" #>
<#@ assembly name="System.dll" #>
<#@ assembly name="System.Data.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#
string databaseName = "YOUR DATABASE NAME HERE!!";

string connectionString="Data Source=(local);Initial Catalog="+databaseName+";Integrated Security=true;";
string cmdText=@"
select ob.object_id, ob.name, mo.definition
    from sys.objects ob
        inner join sys.sql_modules mo on ob.object_id=mo.object_id
    where type=’P’ and name not like ‘sp_%’
    order by ob.name
";

using( SqlConnection conn = new SqlConnection(connectionString) )
using( SqlCommand cmd = new SqlCommand(cmdText,conn) )
{
    conn.Open();
    try
    {
#>
declare @procs table( name sysname not null)
declare @statement nvarchar(max)
<#
        using( SqlDataReader reader = cmd.ExecuteReader() )
        {
            while( reader.Read() )
            {
                int objectId = reader.GetInt32(0);
                string name=reader.GetString(1);
                string definition=reader.GetString(2);
#>
— <#=name#>
insert @procs (name) values(‘<#=name#>’)
if exists (select * from sys.objects where name='<#=name#>’ and type=’P’)
begin
    drop procedure <#=name#>
end
select @statement='<#=definition.Replace("’","”")#>’
exec sp_executesql @statement
<#
            }
        }
    }
    finally
    {
        conn.Close();
    }
}
#>
print ‘置き換えされなかったストアドプロシジャ(todo drop?)’
select name
    from sys.obects
    where type=’P’
        and name not like ‘sp_%’
        and name not in (select name from @procs)

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。