2009-06-01 4 views
52

C'è un modo per mantenere una variabile attraverso un go?C'è un modo per mantenere una variabile attraverso un go?

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

Vai a questa domanda SO per la linea 'USO @bob'.

+0

Perché voi è necessario qualificare il nome della tabella con il nome del DB?Immagino che una domanda simile sia stata posta prima di questa. – shahkalpesh

+0

E non c'è modo di qualificare i nomi delle tabelle con il nome del database in una variabile del genere. Con la sua precedente domanda sull'utilizzo di una variabile con la dichiarazione USE, immagino che avrà bisogno di fare tutto in SQL dinamico, con tutto il dolore che trascina sul tavolo. –

+0

Lo script effettivo integra 4 diversi database. Ho commentato le istruzioni per trovare e sostituire dbName1, dbName2, dbName3 e dbName4. Ho solo pensato che sarebbe stato meno incline all'errore per il client di impostare solo quattro variabili. – NitroxDM

risposta

25

Il comando go viene utilizzato per suddividere il codice in lotti separati. Se questo è esattamente ciò che vuoi fare, dovresti usarlo, ma significa che i batch sono in realtà separati e non puoi condividere le variabili tra loro.

Nel tuo caso la soluzione è semplice; puoi semplicemente rimuovere le istruzioni go, non sono necessarie in quel codice.

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

+0

Alcune istruzioni SQL devono essere la prima istruzione in un blocco (la regione tra le istruzioni GO). Ad esempio: CREATE PROCEDURE o CREATE FUNCTION devono entrambi verificarsi prima di qualsiasi altra istruzione, sia nella parte superiore dello script che immediatamente dopo l'istruzione GO (nota: spazio bianco e commenti sono consentiti prima di queste istruzioni). Quando si eseguono script in cui tali istruzioni devono essere eseguite dopo altra logica, sono richieste le istruzioni GO. Ma devo ammettere che nella maggior parte dei casi, le dichiarazioni GO possono essere rimosse. – Zarepheth

+0

@Zarepheth: buon punto. Non è necessario in questo specifico codice, ma è utile sapere che potrebbero essere necessari in alcuni casi. – Guffa

+1

Perché il downvote? Se non spieghi cosa pensi che sia sbagliato, non può migliorare la risposta. – Guffa

1

Non è 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
84

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

ottima risposta ... in realtà hai risposto alla domanda ASKED piuttosto che dare un giro di lavoro. –

2

è possibile utilizzare SQL dinamico, basta essere consapevoli dei rischi per la sicurezza con questo (non sicuro al 100% sul corretta Syntex)

dichiarare @bob nvarchar (50)

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

execute sp_executesql @sql 
+0

So che questa è una vecchia risposta, ma potrebbe anche apparire in una ricerca. Quando l'istruzione viene eseguita e il controllo viene restituito alla routine chiamante, continuerai a utilizzare il database in cui ti trovavi prima di eseguire l'istruzione "uso" dinamica. Quindi questo non dovrebbe essere confuso come un modo per cambiare effettivamente il database corrente. – Storm

12

preferisco la risposta this da questa domanda Global Variables with GO

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

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

Quindi è possibile utilizzare il seguente tipo 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 
+0

Stavo reindirizzando l'output della query a un altro file (: out nome file) in modalità SQLCMD, e per ottenere l'output flushed al file devi eseguire un GO, quindi questo: la sintassi setvar è necessaria per sostituire le normali variabili in quella situazione dal momento che Sei obbligato a suddividere le cose in lotti. – Anssssss

0

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) 

Assicurarsi modo sicuro SQLCMD è in Server Management Studi, è possibile farlo attraverso il menu in alto fare clic su Query e attivare la modalità SQLCMD on.

più sul tema può essere trovato qui: MS Documentation

1

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