Domanda

C'è un modo per mantenere un variabile tra un andare?

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')

Vedere questo COSÌ domanda per l'USO di @bob linea.

È stato utile?

Soluzione

Il comando go viene usato per dividere il codice in lotti separati. Se questo è esattamente ciò che si vuole fare, allora si dovrebbe usarlo, ma significa che le partite sono in realtà a parte, e non è possibile condividere le variabili tra loro.

Nel tuo caso la soluzione è semplice; si può semplicemente rimuovere le dichiarazioni go, non sono necessari in quel codice.

Nota a margine:. Non è possibile utilizzare una variabile in un comunicato use, deve essere il nome di un database

Altri suggerimenti

Utilizzare una tabella temporanea:

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

Io preferisco il questo rispondere a questa domanda da variabili globali con GO

che ha il vantaggio di essere in grado di fare quello che in origine voleva fare pure.

L'avvertenza è che è necessario per attivare la modalità SQLCMD (sotto query-> SQLCMD) o accenderlo per impostazione predefinita per tutte le finestre di query (Strumenti-> Opzioni, quindi Query Risultati> Per impostazione predefinita, nuove query aperto in modalità SQLCMD )

Quindi è possibile utilizzare i seguenti tipi di codice (completamente strappato via da quella stessa risposta da 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

Non sono sicuro, se questo aiuta

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

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

execute sp_executesql @t

Se si utilizza SQL Server si può variabili globali di configurazione per intero script come:

:setvar sourceDB "lalalallalal"

e utilizzare in seguito in script come:

$(sourceDB)

Accertarsi che la modalità SQLCMD è in Server Management Studi, è possibile farlo tramite il menu in alto fare clic su Query e attivare la modalità SQLCMD on.

Ulteriori informazioni su argomento si possono trovare qui: MS Documentation

tabelle temporanee vengono mantenute sopra dichiarazioni GO, quindi ...

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

Non è abbastanza, ma funziona

Crea i tuoi stored procedure che salvare / caricare in una tabella temporanea.

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

Quindi è possibile utilizzare questo:

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)))

Output:

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

È inoltre possibile utilizzare questi:

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

Output di exec dbo.MyVariableList:

Name    Value
test    42

Si scopre che essere in grado di elencare tutte le variabili in una tabella è in realtà abbastanza utile. Quindi, anche se non si carica una variabile più tardi, la sua grande a scopo di debug per vedere tutto in un unico luogo.

Questo utilizza una tabella temporanea con un prefisso ##, quindi è appena sufficiente per sopravvivere una dichiarazione GO. Esso è destinato a essere utilizzato all'interno di un singolo script.

E le stored procedure:

-- 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

Se avete solo bisogno di un sì binari / no (come se è presente una colonna), allora si può usare SET NOEXEC ON per disabilitare l'esecuzione di istruzioni. SET NOEXEC ON funziona su GO (attraverso lotti). Ma ricordarsi di accendere EXEC spalle con SET NOEXEC OFF alla fine dello script.

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

Questa compila dichiarazioni ma non li esegue. Quindi, ci si può comunque "errori di compilazione" se si fa riferimento lo schema che non esiste. Così funziona per "spegnere" la sceneggiatura secondo run (quello che sto facendo), ma non funziona per spegnere parti dello script il 1 ° periodo, perché ci si può comunque compilare errori se fa riferimento a colonne o tabelle che don 't esiste ancora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top