我当前正在编写一个存储过程,该过程将在数据库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”命令。
我还能做些什么呢?
答案 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_executesql
在sp_executesql
数据库的上下文中执行?