質問

変数を継続的に保持する方法はありますか?

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」行についての質問です。

役に立ちましたか?

解決

goコマンドは別々のバッチにコードを分割するために使用されます。それはあなたがしたい正確に何である場合は、それを使用する必要がありますが、それはバッチが実際に分離され、そしてあなたがそれらの間で変数を共有することができないことを意味します。

あなたのケースでは解決策は単純です。あなたがちょうど彼らがそのコードで必要とされていない、go文を削除することができます。

サイドノート:あなたは、それはデータベースの名前である必要があり、use文で変数を使用することはできません。

他のヒント

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

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

わからない、この場合に役立ちます。

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

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

execute sp_executesql @t

は、SQL Serverを使用している場合することができますように全体のスクリプトのセットアップグローバル変数ます:

:setvar sourceDB "lalalallalal"

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

$(sourceDB)

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

トピックの詳細は、ここで見つけることができます: MSのドキュメント

一時テーブルは、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

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

一時テーブルへ/負荷を保存し、独自のストアド・プロシージャを作成します。

MyVariableSave   -- Saves variable to temporary table. 
MyVariableLoad   -- Loads variable from temporary table.

次に、あなたがこれを使用することができます:

print('Test stored procedures for load/save of variables across GO statements:')

declare @MyVariable int = 42
exec dbo.MyVariableSave @Name = 'test', @Value=@MyVariable
print('  - Set @MyVariable = ' + CAST(@MyVariable AS VARCHAR(100)))

print('  - GO statement resets all variables')
GO -- This resets all variables including @MyVariable

declare @MyVariable int
exec dbo.MyVariableLoad 'test', @MyVariable output
print('  - Get @MyVariable = ' + CAST(@MyVariable AS VARCHAR(100)))

出力:

Test stored procedures for load/save of variables across GO statements:
  - Set @MyVariable = 42
  - GO statement resets all variables
  - Get @MyVariable = 42

また、これらを使用することができます:

exec dbo.MyVariableList       -- Lists all variables in the temporary table.
exec dbo.MyVariableDeleteAll  -- Deletes all variables in the temporary table.

exec dbo.MyVariableListの出力:

Name    Value
test    42

これは、テーブル内のすべての変数を一覧表示することができるということは実際には非常に有用であることが判明しました。ですから、一つの場所ですべてを確認するために、デバッグの目的で、後に、その偉大な変数をロードしていない場合でもます。

このは##の接頭辞を持つ一時テーブルを使用していますので、GOステートメントを生き残るためにちょうど十分です。単一のスクリプト内で使用されることを意図されています。

とストアドプロシージャ:

-- Stored procedure to save a variable to a temp table.
CREATE OR ALTER PROCEDURE MyVariableSave 
    @Name varchar(255),
    @Value varchar(MAX)
WITH EXECUTE AS CALLER
AS  
BEGIN
    SET NOCOUNT ON
    IF NOT EXISTS (select TOP 1 * from tempdb.sys.objects where name = '##VariableLoadSave')
    BEGIN
        DROP TABLE IF EXISTS ##VariableLoadSave
        CREATE TABLE ##VariableLoadSave
        (
            Name varchar(255),
            Value varchar(MAX)
        )
    END
    UPDATE ##VariableLoadSave SET Value=@Value WHERE Name=@Name
    IF @@ROWCOUNT = 0
        INSERT INTO ##VariableLoadSave SELECT @Name, @Value
END
GO
-- Stored procedure to load a variable from a temp table.
CREATE OR ALTER PROCEDURE MyVariableLoad 
    @Name varchar(255),
    @Value varchar(MAX) OUT
WITH EXECUTE AS CALLER
AS  
BEGIN
    IF EXISTS (select TOP 1 * from tempdb.sys.objects where name = '##VariableLoadSave')
    BEGIN
        IF NOT EXISTS(SELECT TOP 1 * FROM ##VariableLoadSave WHERE Name=@Name)
        BEGIN
            declare @ErrorMessage1 as varchar(200) = 'Error: cannot find saved variable to load: ' + @Name
            raiserror(@ErrorMessage1, 20, -1) with log
        END

        SELECT @Value=CAST(Value AS varchar(MAX)) FROM ##VariableLoadSave
        WHERE Name=@Name
    END
    ELSE
    BEGIN
        declare @ErrorMessage2 as varchar(200) = 'Error: cannot find saved variable to load: ' + @Name
        raiserror(@ErrorMessage2, 20, -1) with log
    END
END
GO
-- Stored procedure to list all saved variables.
CREATE OR ALTER PROCEDURE MyVariableList
WITH EXECUTE AS CALLER
AS  
BEGIN
    IF EXISTS (select TOP 1 * from tempdb.sys.objects where name = '##VariableLoadSave')
    BEGIN
        SELECT * FROM ##VariableLoadSave
        ORDER BY Name
    END
END
GO
-- Stored procedure to delete all saved variables.
CREATE OR ALTER PROCEDURE MyVariableDeleteAll
WITH EXECUTE AS CALLER
AS  
BEGIN
    DROP TABLE IF EXISTS ##VariableLoadSave
    CREATE TABLE ##VariableLoadSave
    (
        Name varchar(255),
        Value varchar(MAX)
    )
END

バイナリの Yes/No だけが必要な場合 (列が存在するかどうかなど)、次のように使用できます。 SET NOEXEC ON ステートメントの実行を無効にします。 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回目の実行(私がやっていること)を「オフ」にすることは機能しますが、最初の実行でスクリプトの一部をオフにすることは機能しません。まだ存在しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top