我可以在另一个带有MS SQL的数据库中创建一个具有动态名称的VIEW吗?

时间:2010-01-28 10:09:25

标签: sql-server view

我在MS SQL CREATE VIEW语法中发现了奇怪的规则。 它必须位于查询批处理的第一行,并且必须在当前数据库中创建。

我应该创建具有字符串变量描述的动态名称的VIEW (类型:VARCHAR或NVARCHAR)。这些VIEW应该在其他数据库中创建。

由于规则,CREATE VIEW语句必须在查询批处理的第一行,它不能在USE语句之后。 所以,我试图用USE& amp; GO声明。但是GO声明似乎清楚了所有的变数。因此,在GO语句之后,它们不能用于描述VIEW名称。

你对我有什么意见吗? 如果您知道CREATE VIEW语法规则的原因,请告诉我。


哦〜,抱歉。我错过了一件事。数据库的名称也是动态的。 我想做的是,VIEWs不仅应该访问其他数据库的表 但也要在其他数据库中创建。

虽然我不太了解OLAP,但我认为这种情况涉及OLAP。

3 个答案:

答案 0 :(得分:1)

您可以动态创建一个sql-string并执行它。

 DECLARE @ViewName VARCHAR(100)

 SET @ViewName = 'MyView'

 USE MyDB;

 EXEC ( 'CREATE VIEW dbo.' + @ViewName + ' '
      + 'AS SELECT * FROM dbo.MyTable')

答案 1 :(得分:1)

CREATE SYNONYM Resource1 FOR LinkedServer.Database.Schema.Table
GO
CREATE VIEW Resource1View
AS
SELECT *
FROM Resource1
GO

现在您可以根据需要更改同义词,并且引用它的所有视图都将引用正确的内容。如果这不能解决问题,那么我建议您设计系统的方式并不是最好的。请描述更多您正在做的事情以及为什么我们可以更好地为您提供建议。

对于“GO”,它实际上不是SQL语句。它永远不会提交给服务器。 客户端会在其上看到带有GO的行,并将提交的查询分成不同的批次。跟踪将证明这一点,EXEC 'SELECT 1' + CHAR(13) + CHAR(10) + 'GO' + CHAR(13) + CHAR(10) + 'SELECT 2'也是如此。

如果您在Analysis Services中使用OLAP,那么我没有足够的经验来帮助您,但我认为有很多方法可以选择数据库来连接,就像SSRS一样,查询不必存在于数据库中,但可以存在于SSAS应用程序中。

答案 2 :(得分:0)

我找到了。这是嵌套的EXEC。