Sql server 是否可以使用EXEC在其他数据库中创建视图?

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

我目前正在编写一个存储过程,它将在数据库a上执行。 它在其他数据库上循环,如果找不到,则应在那里创建一个视图。下面是一个片段:

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的另一种方法,好吗。谢谢:-)