【发布时间】:2017-01-20 19:25:00
【问题描述】:
我正在编写动态 SQL 语句来在特定数据库中的远程服务器上创建视图。我生成的 SQL 语句在主数据库上执行。如果我在 CREATE VIEW 语句中使用 3 部分命名约定,则无济于事。
--QUERY
SELECT
'IF OBJECT_ID(N'''+ ss.name +'.view_' + so.name + ''') IS NULL
EXECUTE (''CREATE VIEW ' + ss.name + '.view_' + so.name + ' AS SELECT * FROM REMOTEDATABASE.' + ss.name + '.' + so.name + ''') AT [REMOTESERVER]'
FROM sys.objects so
JOIN sys.schemas ss
ON so.[schema_id] = ss.[schema_id]
WHERE so.[type] = 'U';
--Query Result
IF OBJECT_ID(N'dbo.view_Test') IS NULL
EXECUTE ('CREATE VIEW dbo.view_Test AS SELECT * FROM REMOTEDATABASE.dbo.Test') AT [REMOTESERVER]
【问题讨论】:
-
无论答案是什么,它都会在 SQL 2016 SP1 中过时——新命令——
CREATE OR ALTER VIEW <viewname>。见blogs.msdn.microsoft.com/sqlserverstorageengine/2016/11/17/… -
在视图中使用 * 不是一个好主意。如果表结构发生变化,您的视图将不会自行更新以包含新列。如果在视图中添加了一个新列而另一个删除了值,则更令人困惑的是可以移动列。
-
你得到什么错误?
-
@Sean Lange:我没有使用 SELECT *,我只是将它用于 deomostration。 Xedni:如果我包含 USE
CREATE VIEW 我得到 create view 应该是批处理错误中的唯一语句。
标签: sql-server tsql sql-server-2012