【问题标题】:How to create stored procedure to create views across databases in the same SQL server?如何创建存储过程以在同一 SQL 服务器中跨数据库创建视图?
【发布时间】:2019-09-14 09:47:17
【问题描述】:

我正在尝试在 master 数据库中创建一个存储过程,该过程在此下创建跨其他数据库的视图。

我尝试在 EXEC 下使用“USE dbname”,但没有成功。

这是我正在使用的代码,

CREATE PROCEDURE BuildMultipleViews
    AS
    EXEC ('USE database1
    GO
    CREATE VIEW ST
    AS
    SELECT DISTINCT t.col1, t.col2
 FROM table1 t')
GO

【问题讨论】:

  • 使用 Aaron Bertrand 的 sp_MSforeachdb mssqltips.com/sqlservertip/2201/… 版本。
  • @JohnDoe 那么,对于每个具有名为table1 的表的数据库,在该数据库中创建一个视图,为每个数据库使用相同的视图 DDL?请edit您的问题。

标签: sql sql-server tsql stored-procedures


【解决方案1】:

GO 不是 T-SQL 语句。 GO 是一个批处理分隔符,只能被 SSMS 和 SQLCMD 等 T-SQL 实用程序以及一些 SMO API 识别。 SQL Server 将无法理解您问题中 T-SQL 脚本中GO 的含义。

要在调用存储过程之外的数据库中创建视图,请使用目标数据库名称限定的sp_executesql,并确保CREATE VIEW 是执行批处理中的唯一语句:

CREATE PROCEDURE dbo.BuildMultipleViews
AS
DECLARE @CreateViewStatement nvarchar(MAX) = 
N'CREATE VIEW ST
AS
SELECT DISTINCT t.col1, t.col2
FROM table1 t;';
EXECUTE Database1..sp_executesql @CreateViewStatement;
EXECUTE Database2..sp_executesql @CreateViewStatement;
GO

【讨论】:

  • 代码运行成功,但我没有看到任何正在创建的视图@Dan
  • @JohnDoe,也许您只需要刷新对象资源管理器,或者使用SELECT * FROM Database1.dbo.ST; 进行测试。
  • @JohnDoe Table1 表是否存在于其他数据库中?
  • @JohnDoe,我测试了代码,它确实有效。确保您连接到同一个 SQL 实例。
  • 我们目前只在一个数据库中进行测试,但我们也无法看到该数据库中的视图。
猜你喜欢
  • 2014-09-09
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多