94

変数を永続化する方法はありますか?

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の質問を参照してください。

4

9 に答える 9

143

一時テーブルを使用します。

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
于 2009-06-02T05:14:50.007 に答える
35

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

あなたの場合、解決策は簡単です。ステートメントを削除するだけgoで、そのコードでは必要ありません。

補足:useステートメントで変数を使用することはできません。データベースの名前である必要があります。

于 2009-06-02T00:08:29.580 に答える
17

この質問から のこの回答を好みます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
于 2015-06-18T06:39:31.713 に答える
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

きれいではありませんが、機能します

于 2017-09-18T09:03:17.993 に答える
0

これが役立つかどうかはわかりません

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

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

execute sp_executesql @t
于 2009-06-02T00:23:20.503 に答える
0

SET NOEXEC ONバイナリの yes/no のみが必要な場合 (列が存在する場合など) 、ステートメントの実行を無効にする ために使用できます。SET NOEXEC ONGO全体(バッチ全体)で機能します。ただし、スクリプトの最後で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回目の実行でスクリプトの一部をオフにすることはできません。まだ存在しません。

于 2019-06-07T19:35:22.977 に答える