我想当前数据库与SQL语句进行切换。 我曾尝试以下,但所有的努力都失败了:
- USE @DatabaseName
- EXEC sp_sqlexec @sql - ,其中@sql = '使用[' + @DatabaseName + ']'
要添加更多的细节。
编辑:我想在两个单独的数据库,其中都配置有可变执行几件事。 事情是这样的:
USE Database1
SELECT * FROM Table1
USE Database2
SELECT * FROM Table2
我想当前数据库与SQL语句进行切换。 我曾尝试以下,但所有的努力都失败了:
要添加更多的细节。
编辑:我想在两个单独的数据库,其中都配置有可变执行几件事。 事情是这样的:
USE Database1
SELECT * FROM Table1
USE Database2
SELECT * FROM Table2
exec sp_execsql @Sql
在DB的变化仅持续时间来完成@sql
http://blog.sqlauthority.com/2007/07/02/sql-server-2005-comparison-sp_executesql-vs-executeexec/
我有同样的问题,我有一个丑陋的战胜它 - 但有用的 - 一套的GOTO的。
我之前的一切称之为“脚本运行”的原因是,我想隐藏的来自只想用实际的脚本工作任何开发的复杂和丑陋的做法。 与此同时,我可以确保该脚本在两个完全相同的方式运行(可扩展到三个或更多)的数据库。
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
用这种方法你能保持你的变量和SQL Server不吓坏了,如果你碰巧两次去了DECLARE语句。
前者的问题是,你在做什么是USE 'myDB'
,而不是USE myDB
。 你传递一个字符串; 但用的是寻找一个明确的参考。
后者的例子为我工作。
declare @sql varchar(20)
select @sql = 'USE myDb'
EXEC sp_sqlexec @Sql
-- also works
select @sql = 'USE [myDb]'
EXEC sp_sqlexec @Sql
只是想感谢KM他的有价值的解决方案。 我实现它自己,以减少对SQLServer的一个SHRINKDATABASE请求线的量。 这是我的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)
试试这个:
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)
我区分有人需要一个解决方案,这是一个:
如果您使用的是动态的使用语句的所有查询必须是动态的,因为它需要在相同的来龙去脉。
您可以尝试SYNONYM,基本上是一个别名到一个特定的表,这个同义字插入sys.synonyms表,以便从任何方面对它的访问
看看这个静态的语句:
CREATE SYNONYM MASTER_SCHEMACOLUMNS FOR Master.INFORMATION_SCHEMA.COLUMNS
SELECT * FROM MASTER_SCHEMACOLUMNS
目前动态:
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
现在只是改变@CATALOG的价值,你将能够列出同一个表,但是从不同的目录中。
如果SQLCMD是一种选择,它支持超越什么直T-SQL可以做脚本变量。 例如: http://msdn.microsoft.com/en-us/library/ms188714.aspx
你可以这样做:
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!}
这意味着你可以做一个递归选择如下所示:
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)
使用exec sp_execsql @Sql
例
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
-- If you are using a variable for the database name.
-- Try something like this.
DECLARE @DBName varchar(50)
Set @DBName = 'Database1'; /* could be passed in by a parameter. */
IF( @DBName = 'Database1')
Begin
USE [Database1];
SELECT FROM Table1;
End
IF( @DBName = 'Database2')
Begin
USE [Database2];
SELECT FROM Table2;
End
IF( @DBName is null)
Begin
USE [Database1];
End