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

时间:2019-01-10 12:04:31

标签: 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('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语句完全分开)。据我所知(并已尝试),无法在EXEC中使用“ Go”命令。

我还能做些什么呢?

2 个答案:

答案 0 :(得分:2)

解决方案可以将视图的创建封装在另一个动态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;')

并成功创建视图。

答案 1 :(得分:1)

此外,您不能使用USE,而只需从您感兴趣的数据库中调用sp_executesql

下面是一个示例,该示例说明如何在每个数据库(不包括vDateView)中创建视图system databases(如果不存在):

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_executesqlsp_executesql数据库的上下文中执行?