instrução de Utilização sql com variável
- utilizar @DatabaseName
- 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
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/
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.
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
-- 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)
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)
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.
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
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
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)
-- 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