T-SQL语句FROM子句的动态数据库名称

时间:2016-01-14 20:02:14

标签: sql-server tsql dynamic

我有几个包含相同表名和结构的数据库。我需要能够执行一个简单的T-SQL,它将针对每一个运行,我希望使用变量填充FROM子句中的数据库名称。我可以这样做,还是有更好的方法?

这是一个代码示例,它不起作用,但应该举例说明我要做的事情。

DECLARE @dbn sysname;

SET @dbn = 'EDIT'

select sde_id, owner, direct_connect, nodename + ':' + sysname "nodename:sysname", start_time
  FROM **[@dbn]**.[SDE].[SDE_process_information]

2 个答案:

答案 0 :(得分:0)

您的查询不明确且所有内容都混乱,但您需要按照以下代码中的方法进行操作。在这种方法中,您需要首先根据您的案例中的数据库名称等变量创建查询,然后使用sp_executesql执行生成的查询。

DECLARE @dbn nvarchar(1000);

SET @dbn = N'EDIT';

declare @qry nvarchar(max);

set @qry = N'select sde_id, owner, direct_connect, nodename ,sysname , start_time
  FROM ' + @dbn + N'.[SDE].[SDE_process_information]';

execute sp_executesql @qry;

答案 1 :(得分:0)

您可以使用动态sql。同时,你想负责任地使用它。

如果您有可以参与计划重用的参数,则应将它们集成在一起。

这是一个通用的Northwind(微软样本数据库)示例:

动态sql是一种祝福和诅咒。不要为此疯狂。请其他开发商乞求你。

也可以看到这一点:http://sqlmag.com/database-performance-tuning/don-t-fear-dynamic-sql

  

"我现在不能强调计划重用的重要性。太   许多新的开发工作都利用了一个以中心为基础的框架   临时构建提交给数据库的T-SQL语句   引擎作为非参数化批次。虽然这可能会使   开发工作稍微容易些,它对数据库产生负面影响   性能和可扩展性。"

DECLARE @SQL NVARCHAR(500), @DatabaseName NVARCHAR(100), @Schema NVARCHAR(128),
@Table NVARCHAR(128), @OrderID INT, @EmployeeID INT ;
SET @DatabaseName = 'Northwind'; -- 'NorthwindPartial'
SET @Schema = 'dbo'
SET @Table = 'Employees' ;
SET @EmployeeID = 3 ;

select 'below probably does plan-reuse'
SET @SQL = 'SELECT EmployeeId ' + ' FROM ' + @DatabaseName + '.' + @Schema + '.' + @Table + ' WHERE EmployeeID > @P1' ;
select @sql as sp_executesqlStatement
EXEC sp_executesql @SQL, N'@P1 INT', @P1 = @EmployeeID ;

GO