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



我有几个包含相同表名和结构的数据库。我需要能够执行一个简单的 T-SQL,它将针对每个 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]

您的查询不清楚并且全部混乱,但您需要遵循以下代码中的方法。在此方法中,您需要首先根据数据库名称等变量创建查询,然后使用 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;

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

如果您有有助于计划重用的参数,则应集成它们。

下面是一个通用的罗斯文(微软示例数据库)示例:

动态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

最新更新