2016-10-14 21 views
3

私はの線に沿って何かやろうとしている:仕事でSQLのIF文内で[データベース]トランザクションを使用するにはどうすればよいですか?

IF(@@SERVERNAME = 'SERVER1') 
BEGIN 
    USE Appt 
END 
IF(@@SERVERNAME = 'SERVER2') 
BEGIN 
    USE ApptDEMO 
END 

を、生産のための私達のデータベースは"Appt"ですが、テスト環境のための1つが"ApptDEMO." である彼らは同じことだが、彼らがしています異なった名前を付けました。

"Appt""ApptDEMO"の両方が存在するため、テスト環境で正常に動作します("Appt"を使用していません)。 しかし、実際には「ApptDEMO」は存在しないと私に伝えています。

異なる環境にx個の異なるスクリプトを作成する必要がないスクリプトを作成したいとします。 これは可能ですか?

ありがとうございます。

+4

私が知っている限り、SQLがUSE文を処理する方法のために動的SQLを実行しなければ、これを行うことはできません。 USE文も、実行されたバッチにスコープが設定されています。 「テストで正常に動作します」 - テストで正常に実行されるものは何ですか?スクリプト? スクリプトは何をしますか?あなたは他のSQL機能の使用を検討しましたか(おそらくSYNONYMSがここにお手伝いできますか?)。あなたが望むものを達成するためのよりよい方法があれば、ちょうど解決しようとしています。 – Charleh

+0

私は@Charlehに同意します。これは同義語を使用する主要な例のようです。 https://msdn.microsoft.com/en-us/library/ms187552.aspx –

+0

(私はこのサイトを初めて利用しています...笑) すみません、皆様にお返事いただきありがとうございます!私はSYNONYMSを調べて、それが私を助けてくれるかどうかを調べるつもりです! –

答えて

0

は(動的SQLで)これを試してみてください:

DECLARE @sql nvarchar(4000) 
IF (@@SERVERNAME = 'SERVER1') 
BEGIN 
    SET @sql = N'USE Appt' 
END 
ELSE IF (@@SERVERNAME = 'SERVER2') 
BEGIN 
    SET @sql = N'USE ApptDEMO' 
END 

IF (@sql != N'') 
BEGIN 
    EXECUTE sp_executesql @sql 
END 
+1

これは 'sp_executesql'で実行されたバッチに対するUSEのみをスコープしています。その作業を行うためのバッチ。 '@ sql'変数に文を追加しない限り、無駄です。 – Charleh

+0

@Charleh:DB選択にスクリプトを集中させます。 sql変数には、他の文を入れることができます –

0

データベースは、クエリの動的を作る、他の(USE [DB])を動的に変更することはできません。

下記のコードは、ご理解を明確にする場合があります。

SELECT DB_NAME(); 
-- Master --Default Database 

SELECT @@SERVERNAME 
-- SERVER1 

DECLARE @USEDB NVARCHAR(MAX) = 
CASE @@SERVERNAME WHEN 'SERVER1' THEN 'USE [Appt];' 
        WHEN 'SERVER2' THEN 'USE [ApptDEMO];' 
END -- Same as IF statement 

EXEC(@USEDB) -- The database [Appt] will be changed within this batch, not outside. 
SELECT DB_NAME(); 
-- Master --Default Database 

DECLARE @MyQuery VARCHAR(MAX) = 'Select DB_NAME();' 
DECLARE @UseDBWithQuery VARCHAR(MAX) = @USEDB + @MyQuery 

EXEC(@UseDBWithQuery) 
-- Appt 
関連する問題