変数を永続化する方法はありますか?
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')
「USE @bob」行については、このSOの質問を参照してください。
変数を永続化する方法はありますか?
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')
「USE @bob」行については、このSOの質問を参照してください。
一時テーブルを使用します。
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
このgo
コマンドは、コードを個別のバッチに分割するために使用されます。それがまさにあなたがやりたいことであるなら、あなたはそれを使うべきです、しかしそれはバッチが実際に別々であり、それらの間で変数を共有することができないことを意味します。
あなたの場合、解決策は簡単です。ステートメントを削除するだけgo
で、そのコードでは必要ありません。
補足:use
ステートメントで変数を使用することはできません。データベースの名前である必要があります。
この質問から のこの回答を好みますGO を使用したグローバル変数
これには、もともとやりたかったこともできるという追加の利点があります。
注意点は、SQLCMD モードを有効にする ([クエリ] -> [SQLCMD] の下) か、すべてのクエリ ウィンドウに対してデフォルトで有効にする必要があることです ([ツール] -> [オプション]、[クエリ結果] -> [デフォルトで、SQLCMD モードで新しいクエリを開きます])。
次に、次のタイプのコードを使用できます ( 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
一時テーブルは 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
きれいではありませんが、機能します
これが役立つかどうかはわかりません
declare @s varchar(50)
set @s='Northwind'
declare @t nvarchar(100)
set @t = 'select * from ' + @s + '.[dbo].[Customers]'
execute sp_executesql @t
SET NOEXEC ON
バイナリの yes/no のみが必要な場合 (列が存在する場合など) 、ステートメントの実行を無効にする ために使用できます。SET NOEXEC ON
GO全体(バッチ全体)で機能します。ただし、スクリプトの最後でEXEC をオンに戻すことを忘れないでください。SET NOEXEC OFF
IF COL_LENGTH('StuffTable', 'EnableGA') IS NOT NULL
SET NOEXEC ON -- script will not do anything when column already exists
ALTER TABLE dbo.StuffTable ADD EnableGA BIT NOT NULL CONSTRAINT DF_StuffTable_EnableGA DEFAULT(0)
ALTER TABLE dbo.StuffTable SET (LOCK_ESCALATION = TABLE)
GO
UPDATE dbo.StuffTable SET EnableGA = 1 WHERE StuffUrl IS NOT NULL
GO
SET NOEXEC OFF
これはステートメントをコンパイルしますが、実行はしません。したがって、存在しないスキーマを参照すると、「コンパイル エラー」が発生します。したがって、スクリプトの2回目の実行を「オフ」にすることはできますが(私がやっていること)、1回目の実行でスクリプトの一部をオフにすることはできません。まだ存在しません。