2011-07-12 4 views
-1

私はトリガを動的に作成しようとしており、create文の一部、特に結合が行われたデータベース名を置き換える必要があります。SQLトリガ作成で変数を使用する

CREATE TRIGGER [dbo].[tr_UseType_update] ON [dbo].[UseType] FOR UPDATE AS 
BEGIN 
    SET NOCOUNT ON 
    INSERT [dbo].[UseType] 
    SELECT 'Updated', i.* 
    FROM inserted 
    INNER JOIN [(SELECT DB_NAME())].[dbo].[UseType] i ON inserted.[UseTypeID] = i.[UseTypeID] 
END 

)私はこれを試してみたが、明らかにそれはちょうどそれが実際にSELECT DB_NAMEを(評価しないテキストは使用しています、それはこの値を評価するために取得する方法があります。

私は2005/8 SQLを使用しています。私たちはsqlcmdを使用するデプロイメントツールを持っているので、sqlcmdに渡すことができる変数を取り込むようにツールを変更することになりますが、私は作業量を減らして(生成される)スクリプト自体で行うことができます。便利です。

+0

これは、このトリガーを持つUseTypeテーブルを含む同じデータベースに解決されるため、DB_NAME()は必要ありません。トリガーがオンになっている同じテーブルに書き込みます。あなたが実際に*解決しようとしている問題は何ですか? – gbn

+0

なぜデータベース名を含むのですか? 'dbo.UseType'はあなたに適切なテーブルを与えるべきではありませんか? –

+0

トリガーは、データベース内のデータベースとは別のデータベースにあります –

答えて

3

唯一の方法は、動的SQLを使用することです。

データベース名またはテーブル名をパラメータ化する他の方法はありません。

これは、このようなトリガを動的に作成することは危険なアイデアのようです。

あなたが何かのようになりたいものを行う最も簡単な方法:あなたが潜在的に動的SQLを実行し、順番にに利用できるようになる一時テーブルにそれをロードすることができ

USE MyDataBase 

DECLARE @DB varchar(100) = 'MyOtherDatabaseThatIAmJoiningToInTheInsert' 
DECLARE @SQL Varchar (MAX) 

SET @SQL = ' 
CREATE TRIGGER [dbo].[tr_UseType_update] ON [dbo].[UseType] FOR UPDATE AS 
BEGIN 
    SET NOCOUNT ON 
    INSERT [dbo].[UseType] 
    SELECT ''Updated'', i.* 
    FROM inserted 
    INNER JOIN ' + @DB + '.[dbo].[UseType] i ON inserted.[UseTypeID] = i.[UseTypeID] 
END' 

It's mandatory to read this before doing any dynamic sql code, though!

+1

DB_NAME()はトリガーとテーブルを含む同じデータベースになります。 – gbn

+1

@gbn - そう、その理由は無意味です。私は彼が複数のDBのためにこれをやりたいと思っていて、 'sp_msforeachdb'のようなものが必要でしょう – JNK

+0

@gbn - 彼のコメントに基づいて更新されました – JNK

0

引き金。

+0

しかし、すでに同じデータベースです!質問にコメントを読む – gbn

+0

合意しました、私は単にあなたがそれをやる方法に答えるだけでした。それが行われるべきか、何か価値があるかどうかは関係ありません。トリガ内の動的SQLには、同様の有効な使用方法があります。 – JNappi

関連する問題