脚本如下
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'
答案 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查询 - 这既不是最佳实践也不是默认。
如果您愿意,也可以检查同义词等。
这是一种方式。