2009-06-01 16 views
52

移動中に変数を保持する方法はありますか?移動中に変数を保持する方法はありますか?

Declare @bob as varchar(50); 
Set @bob = 'SweetDB'; 
GO 
USE @bob --- see note below 
GO 
INSERT INTO @bob.[dbo].[ProjectVersion] ([DB_Name], [Script]) VALUES (@bob,'1.2') 

'を使用@bob' 行のために、このSO質問を参照してください。

+0

なぜあなたを行いますテーブル名をDB名で修飾する必要がありますか?私は、これと同じ質問がこの前に尋ねられたと思います。 – shahkalpesh

+0

そして、テーブル名にそのような変数のデータベース名を修飾する方法はありません。 USE文で変数を使用するという以前の質問から、私は動的SQLですべてを行う必要があると推測しています。テーブルにドラッグするすべての苦痛があります。 –

+0

実際のスクリプトは4種類のデータベースを統合しています。 dbName1、dbName2、dbName3、およびdbName4を検索して置き換える手順についてコメントしました。クライアントが4つの変数を設定するだけでエラーが起こりにくいと思った。 – NitroxDM

答えて

25

goコマンドは、コードを別々のバッチに分割するために使用されます。それがまさにあなたがやりたいことならば、それを使うべきですが、バッチは実際には別々のものであり、それらの間で変数を共有することはできません。

解決策は簡単です。 goステートメントを削除することはできますが、そのコードでは不要です。

サイドノート:useステートメントで変数を使用することはできません。これはデータベースの名前でなければなりません。

+0

一部のSQL文は、ブロック内の最初の文(GO文の間の領域)でなければなりません。たとえば、CREATE PROCEDUREまたはCREATE FUNCTIONは、スクリプトの先頭またはGOステートメントの直後にある他のステートメントの前に置く必要があります(注:これらのステートメントの前に空白とコメントを入れることができます)。 このようなステートメントを他のロジックの後に実行する必要があるスクリプトを実行する場合は、GOステートメントが必要です。しかし、私は、ほとんどの場合、GOステートメントを削除できることに同意する必要があります。 – Zarepheth

+0

@Zarepheth:良い点。この特定のコードでは必要ではありませんが、必要になる場合があることを知っておくと便利です。 – Guffa

+1

なぜdownvote?あなたが間違っていると思われることを説明しなければ、答えを改善することはできません。 – Guffa

1

ない、これは

declare @s varchar(50) 
set @s='Northwind' 

declare @t nvarchar(100) 
set @t = 'select * from ' + @s + '.[dbo].[Customers]' 

execute sp_executesql @t
84

一時テーブルを使用してください場合に役立ちます、必ず:

CREATE TABLE #variables 
    (
    VarName VARCHAR(20) PRIMARY KEY, 
    Value VARCHAR(255) 
    ) 
GO 

Insert into #variables Select 'Bob', 'SweetDB' 
GO 

Select Value From #variables Where VarName = 'Bob' 
GO 

DROP TABLE #variables 
go 
+10

すばらしい答え...あなたは実際に回避策を提供するのではなく、質問された質問に実際に答えました。 –

2

あなたは動的SQLを使用することができ、ちょうど上のない100%を確認してください(これでセキュリティリスクを認識することを正しいシンテックス)

宣言@bobのNVARCHAR(50)

declare @sql nvarchar(max) 
set @bob='SweetDB' 
set @sql = 'Use ' + @bob 

execute sp_executesql @sql 
+0

これは古い答えですが、検索でうまくいくかもしれません。ステートメントが実行され、コントロールが呼び出しルーチンに返されると、動的 "use"ステートメントを実行する前のデータベースを使用したままになります。実際のデータベースを実際に変更する方法として混乱させるべきではありません。 – Storm

12

私は、あなたが最初にもやりたいことやることができるという付加的な利点を持っているこの質問 Global Variables with GO

からthis答えを好みます。

クエリ - > SQLCMDの下でSQLCMDモードを有効にするか、デフォルトですべてのクエリウィンドウ(ツール - >オプション、クエリ結果 - >既定でSQLCMDで新しいクエリを開く)モード)を使用すると、SQL Serverを使用している場合は

次に、あなたのような全体のスクリプトのセットアップグローバル変数のことができます。次のコードの種類(完全Oscar E. Fraxedas Tormoすることにより、その同じ答えから食い物)

--Declare the variable 
:setvar MYDATABASE master 
--Use the variable 
USE $(MYDATABASE); 
SELECT * FROM [dbo].[refresh_indexes] 
GO 
--Use again after a GO 
SELECT * from $(MYDATABASE).[dbo].[refresh_indexes]; 
GO 
+0

SQLCMDモードでクエリ出力を別のファイル(:out filename)にリダイレクトしていました。出力をファイルにフラッシュするには、GOを実行する必要があります。このためsetvar構文は、物事をバッチに分割することを余儀なくされた。 – Anssssss

0

を使用することができます。

:setvar sourceDB "lalalallalal" 

と、スクリプトの後半で使用します。

$(sourceDB) 

ていることを確認しSQLCMDモードはサーバ経営管理論大学地区でオンになっているが、あなたは、トップメニューから[クエリ]をクリックし、上のSQLCMDモードを切り替えることを行うことができます。トピックの

詳細はここで見つけることができます:... MS Documentation

1

一時テーブルは、GOステートメントの上に保持されているので、

SELECT 'value1' as variable1, 'mydatabasename' as DbName INTO #TMP 

-- get a variable from the temp table 
DECLARE @dbName VARCHAR(10) = (select top 1 #TMP.DbName from #TMP) 
EXEC ('USE ' + @dbName) 
GO 

-- get another variable from the temp table 
DECLARE @value1 VARCHAR(10) = (select top 1 #TMP.variable1 from #TMP) 

DROP TABLE #TMP 

それはきれいではありませんが、それは動作します

関連する問題