Sql server 是否可以使用EXEC在其他数据库中创建视图?
我目前正在编写一个存储过程,它将在数据库a上执行。 它在其他数据库上循环,如果找不到,则应在那里创建一个视图。下面是一个片段:Sql server 是否可以使用EXEC在其他数据库中创建视图?,sql-server,stored-procedures,Sql Server,Stored Procedures,我目前正在编写一个存储过程,它将在数据库a上执行。 它在其他数据库上循环,如果找不到,则应在那里创建一个视图。下面是一个片段: BEGIN IF OBJECT_ID('['+ @source_db+'].['+@source_schema+'].['+@current_table+']', 'V') IS NULL BEGIN print('source view not available for ' + @source_db ) print('creatin
BEGIN
IF OBJECT_ID('['+ @source_db+'].['+@source_schema+'].['+@current_table+']', 'V') IS NULL
BEGIN
print('source view not available for ' + @source_db )
print('creating view')
EXEC('USE ['+@source_db+']; create view ['+@source_schema+'].['+@current_table+'] as select * from [XYZ].[' + @dc_guid + '].[' + @current_table+']' )
print('view created')
END
END
但是EXEC语句显然不起作用,因为View语句必须是批处理的第一个语句。但是,将use命令分离到另一个EXEC语句也不起作用(我发现两个EXEC语句都是完全独立的)。据我所知(也尝试过),在EXEC中使用“Go”命令是不可能的
我还能做些什么来实现这一点 解决方案可以将视图的创建封装在另一个动态SQL中,该SQL将在数据库连接更改后执行
DECLARE @dynamicSQL VARCHAR(MAX) =
'USE AnotherDatabase;
EXEC(''CREATE VIEW dbo.TestyView AS SELECT 1 AS Something;'')'
EXEC (@dynamicSQL)
如果打印
USE AnotherDatabase;
EXEC('CREATE VIEW dbo.TestyView AS SELECT 1 AS Something;')
并成功创建视图。您也可以不使用
use
,直接从感兴趣的数据库调用sp\u executesql
下面是一个示例,说明如何在每个数据库(系统数据库
除外)中创建视图vDateView
,如果该视图不存在:
exec sp_MSforeachdb
'
if db_id(''?'') > 4 and
not exists
(
select *
from ?.sys.objects
where type = ''v''
and name = ''vDateView''
)
exec ?.dbo.sp_executesql N''create view dbo.vDateView as select getdate() as dt''
'
在这段代码中,
?.dbo.sp_executesql
在?
数据库的上下文中执行sp_executesql
,非常简单,非常好。这很有道理,而且效果很好。不知怎的,我陷入了困境,没有想到解决办法。谢谢:-)啊,很有趣。直到现在才知道。与其他变体相比,这有一些优点/缺点吗?没有优点,只是做同样事情的另一种方法。sp_executesql可以称为db.dbo.sp_executesql,这意味着您不需要使用它。sp_MSforeachdb只是为每个dbAh执行smth的另一种方法,好吗。谢谢:-)