2011-01-14 4 views
1

私はいくつかのデータベースを管理しており、それぞれには特定のストアドプロシージャのコピーが必要です。ストアドプロシージャのT-SQLエラーを回避するにはどうすればよいですか?

問題は、ストアドプロシージャが、そのうちの1つを除くすべてのデータベースのテーブルに挿入されることです。その1つのデータベースでは、テーブルはパーティションビューであり、更新可能ではなく、挿入する必要はありません。

私は、次のような何かをしようとしました:

CREATE PROCEDURE st_doit AS 
    -- Do lots of other stuff... 
    IF(DB_NAME() <> 'db3') BEGIN 
     INSERT INTO mytable...; 
    END 

にもかかわらず、そのデータベースに、理由INSERT声明のdb3にストアドプロシージャを実行しようとしたとき、私はまだエラーメッセージが表示されます、挿入は実際には実行されません。ブロックTRY...CATCHINSERTをラップしても役に立たなかった。

メンテナンスを容易にするため、私は実際にdb3に手順の特別なコピーを置かないようにしたいと思います。通常、私はこのようなIF文を手続きに入れませんが、この特定のケースでは、実際には最良の解決策であり、経時的に成長して時間の経過と共に他の特殊なケースのネストになることはありません。

実際にテーブルに挿入しようとすると、SQL Serverにストアドプロシージャを実行させ、のみのみエラーが発生しますか?

編集:、動的SQLを使用すると、私のために少しも厄介だったので、私のエンド・ソリューションは、トラップとしてIFブロックを保つために、しかしdb3以内に問題のあるブロックをコメントアウトすることでした。理想的ではありませんが、機能します。幸いにも、私はこのSPを頻繁に変更するつもりはありませんが、私はそれをすべてのデータベースに「完全に」コピーしたかったのです。

答えて

2

を使用することだと思います。

CREATE PROCEDURE st_doit AS 
    -- Do lots of other stuff... 
    IF(DB_NAME() <> 'db3') BEGIN 
     EXEC SP_EXECUTESQL N'INSERT INTO mytable...'; 
    END 
+0

うわー、それは残念です。 :( – richardtallent

3

私は唯一の方法は、あなたが「非表示」の動的SQLを使用してSQL ServerからINSERTする必要があると思い動的SQLに

if(objectproperty(object_id('dbo.MyTable'), 'isUserTable') = 1) begin 
    -- insert the value 32 into MyColumn of MyTable 
    exec sp_executesql 
     N'insert into MyTable(MyColumn) values(@MyColumnParam)', 
     N'@MyColumnParam int', 
     32 

end 
+0

objectpropertyとパラメータの使用のためにUpvoted。 – richardtallent

0

IFブロック内のパーツにSPを設定することはできますか? DB3の場合は、何もしないダミーSPとなり、実際の挿入を実行する他のすべてのSPに対してです。元のSPはすべてのDBで同じになります。

EDIT:当然のことながら、2つの「類似の」SPのサポートが必要ですが、最初のSPが非常に複雑な場合にこのようなアプローチの実用性を想像することができます。 2つ目は、挿入物を行うかしないかのどちらか小さい方です。