instrução de Utilização sql com variável

Estou a tentar mudar a base de dados actual com uma declaração SQL. Tentei o seguinte, mas todas as tentativas falharam.
  1. utilizar @DatabaseName
  2. EXEC sp_sqlexec @Sql -- where @Sql = ' USE ['+ @DatabaseName +'] '

para adicionar um pouco mais de detalhe.

editar: gostaria de realizar várias coisas em duas bases de dados separadas, onde ambas são configuradas com uma variável. Algo do género:

USE Database1
SELECT * FROM Table1

USE Database2
SELECT * FROM Table2
Author: John Saunders, 2009-06-24

10 answers

   exec sp_execsql @Sql

A alteração do DB só dura o tempo de completar @sql

Http://blog.sqlauthority.com/2007/07/02/sql-server-2005-comparison-sp_executesql-vs-executeexec/

 10
Author: Preet Sangha, 2009-06-24 11:18:19
Tenho o mesmo problema, superei - o com um conjunto de Góticos feio, mas útil.

A razão pela qual eu chamo o "script runner" antes de tudo é que eu quero esconder a complexidade e abordagem feia de qualquer desenvolvedor que só quer trabalhar com o script real. Ao mesmo tempo, eu posso ter certeza de que o script é executado nas duas bases de dados (extensível a três e mais) exatamente da mesma maneira.

GOTO ScriptRunner

ScriptExecutes:

--------------------ACTUAL SCRIPT--------------------
-------- Will be executed in DB1 and in DB2 ---------
--TODO: Your script right here

------------------ACTUAL SCRIPT ENDS-----------------

GOTO ScriptReturns

ScriptRunner:
    USE DB1
    GOTO ScriptExecutes

ScriptReturns:
    IF (db_name() = 'DB1')
    BEGIN
        USE DB2
        GOTO ScriptExecutes
    END

Com esta abordagem, pode manter as suas variáveis e SQL O servidor não se passa se passar por cima de uma declaração de declaração duas vezes.

 10
Author: Alpha, 2012-11-08 17:23:55

O problema com o primeiro é que o que estás a fazer é USE 'myDB' em vez de USE myDB. você está passando uma corda; mas usar é procurar uma referência explícita.

Este último exemplo funciona para mim.

declare @sql varchar(20)
select @sql = 'USE myDb'
EXEC sp_sqlexec @Sql

-- also works
select @sql = 'USE [myDb]'
EXEC sp_sqlexec @Sql
 8
Author: Joel Goodwin, 2009-06-24 09:05:24
Só queria agradecer ao KM pela sua valiosa solução. Implementei-o eu mesmo para reduzir a quantidade de linhas em um pedido shrinkdatabase no SQLServer. Aqui está o meu pedido SQL se ele pode ajudar qualquer um:
-- Declare the variable to be used
DECLARE @Query varchar (1000)
DECLARE @MyDBN varchar(11);
-- Initializing the @MyDBN variable (possible values : db1, db2, db3, ...)
SET @MyDBN = 'db1';
-- Creating the request to execute
SET @Query='use '+ @MyDBN +'; ALTER DATABASE '+ @MyDBN +' SET RECOVERY SIMPLE WITH NO_WAIT; DBCC SHRINKDATABASE ('+ @MyDBN +', 1, TRUNCATEONLY); ALTER DATABASE '+ @MyDBN +' SET RECOVERY FULL WITH NO_WAIT'
-- 
EXEC (@Query)
 3
Author: tmi, 2016-07-27 08:52:57

Tenta isto:

DECLARE @Query         varchar(1000)
DECLARE @DatabaseName  varchar(500)

SET @DatabaseName='xyz'
SET @Query='SELECT * FROM Server.'+@DatabaseName+'.Owner.Table1'
EXEC (@Query)

SET @DatabaseName='abc'
SET @Query='SELECT * FROM Server.'+@DatabaseName+'.Owner.Table2'
EXEC (@Query)
 2
Author: KM., 2009-06-24 12:07:52
Caso alguém precise de uma solução para isto, esta é uma:

Se você usar uma declaração de uso dinâmico, toda a sua consulta precisa ser dinâmica, porque precisa ser tudo no mesmo contexto.

Você pode tentar com sinônimo, é basicamente um ALIAS para uma tabela específica, este sinônimo é inserido no sys.tabela sinónimos para que tenha acesso a ela a partir de qualquer contexto

Veja esta declaração estática:

CREATE SYNONYM MASTER_SCHEMACOLUMNS FOR Master.INFORMATION_SCHEMA.COLUMNS
SELECT * FROM MASTER_SCHEMACOLUMNS

Agora dinâmico:

DECLARE @SQL VARCHAR(200)
DECLARE @CATALOG VARCHAR(200) = 'Master'

IF EXISTS(SELECT * FROM  sys.synonyms s WHERE s.name = 'CURRENT_SCHEMACOLUMNS')
BEGIN
DROP SYNONYM CURRENT_SCHEMACOLUMNS
END

SELECT @SQL = 'CREATE SYNONYM CURRENT_SCHEMACOLUMNS FOR '+ @CATALOG +'.INFORMATION_SCHEMA.COLUMNS';
EXEC sp_sqlexec @SQL

--Your not dynamic Code
SELECT * FROM CURRENT_SCHEMACOLUMNS
Agora muda o valor. de @CATALOG e você será capaz de listar a mesma tabela, mas de catálogo diferente.
 2
Author: Hans Langer, 2014-06-28 15:18:17

Se o SQLCMD é uma opção, suporta variáveis de scripting acima e além do que o T-SQL pode fazer. Por exemplo: http://msdn.microsoft.com/en-us/library/ms188714.aspx

 1
Author: onupdatecascade, 2009-08-11 21:25:13

Uso exec sp_execsql @Sql

Exemplo

DECLARE @sql as nvarchar(100)  
DECLARE @paraDOB datetime  
SET @paraDOB = '1/1/1981'  
SET @sql=N'SELECT * FROM EmpMast WHERE DOB >= @paraDOB'  
exec sp_executesql @sql,N'@paraDOB datetime',@paraDOB
 0
Author: joe, 2012-11-08 17:16:33

Podes fazer isto:

Declare @dbName nvarchar(max);
SET @dbName = 'TESTDB';

Declare @SQL nvarchar(max);
select @SQL = 'USE ' + @dbName +'; {can put command(s) here}';
EXEC (@SQL);

{but not here!}

Isto significa que pode fazer uma selecção recursiva como a seguinte:

Declare @dbName nvarchar(max);
SET @dbName = 'TESTDB';
Declare @SQL nvarchar(max);

SELECT @SQL = 'USE ' + @dbName + '; ' +(Select ... {query here}
For XML Path(''),Type)
.value('text()[1]','nvarchar(max)');

Exec (@SQL)
 0
Author: Garry_G, 2016-09-17 19:41:28

-- Se estiver a usar uma variável para o nome da base de dados.
-- Tenta algo assim.

DECLARE @DBName varchar(50)
Definir @DBName = 'Database1'; /*

IF (@DBName = 'Database1')
Iniciar
    utilizar [Base de Dados 1];
   SELECCIONAR * a PARTIR de Tabela1;
Fim

SE( @DBName = "Base De Dados 2')
Iniciar
    utilizar [Base de dados 2];
   SELECCIONAR * a PARTIR de Tabela2;
Fim

SE( @DBName é nulo)
Começar
   USE [Database1];
Fim

 -2
Author: AdamA, 2009-08-11 18:16:05