像变量一样传递数据库名称

时间:2015-06-30 09:00:10

标签: sql-server

脚本如下

SELECT *  FROM  table1 --working
SELECT *  FROM  xyz.dbo.table1--working

而不是静态数据库名称,我需要动态,如下所述,但它不起作用,有什么办法吗?

Declare @dbname varchar(10)
set @dbname ='xyz'
SELECT * FROM  tabl1e --working
SELECT * FROM  @dbname.dbo.table1--Not working
SELECT * FROM ['+@dbname+'].[dbo].table1--not working

错误:

Error Message:Invalid object name ''+@dbname+'.dbo.table1'

2 个答案:

答案 0 :(得分:3)

使用动态SQL。

Declare @SQL Nvarchar(100),@dbname varchar(100) 
set @SQL = 'Select *  from '+ @dbname + '.dbo.table1'
Exec Sp_executeSQL @SQL

答案 1 :(得分:1)

这总是很难 - 最常用的,但我不会宽恕,动态的SQL。如果您知道并发问题会有限,即您专门将其作为工作等运行,则可以使用同义词:

--CREATE SYNONYM
declare @environment int
IF @environment = 1
BEGIN
    CREATE SYNONYM tabl1e 
    FOR AdventureWorks2012.Production.tabl1e;
END
ELSE
BEGIN
    CREATE SYNONYM tabl1e 
    FOR AdventureWorks2012.Development.tabl1e;
END

--Get Data
SELECT * FROM tabl1e

--DROP Synonym
DROP SYNONYM tabl1e 

动态SQL的问题是编译器永远无法优化,除非您强制服务器始终优化adhoc查询 - 这既不是最佳实践也不是默认。

如果您愿意,也可以检查同义词等。

这是一种方式。