2013-08-18 35 views
0

所以这类似于其他学校的问题,我被赋予了代码:SQL脚本创建一个视图,而不是派生表的

USE AP 

SELECT VendorName, FirstInvoiceDate, InvoiceTotal 
FROM Invoices JOIN 
    (SELECT VendorID, MIN(InvoiceDate) AS FirstInvoiceDate 
    FROM Invoices 
    GROUP BY VendorID) AS FirstInvoice 
    ON (Invoices.VendorID = FirstInvoice.VendorID AND 
     Invoices.InvoiceDate = FirstInvoice.FirstInvoiceDate) 
JOIN Vendors 
    ON Invoices.VendorID = Vendors.VendorID 
ORDER BY VendorName, FirstInvoiceDate 

我需要改变这种创造,而不是派生表我是一个视图思考更多的东西一样

IF NOT EXISTS (SELECT * FROM sys.views 
     Where name = ‘EarliestInvoiceandTotalVEW’) 


CREATE View AS 
Select VendorName, FirstInvoiceDate, InvoiceTotal 
From Invoices JOIN 
    (Create VIEW FirstInvoice AS 
    SELECT VendorID, MIN(InvoiceDate) AS FirstInvoiceDate 
    From Invoices 
    Group By VendorID) As FirstInvoice 
    ON (Invoices.VendorID = FirstInvoice.VendorID AND 
     Invoices.InvoiceDate = FirstInvoice.FirstInvoiceDate) 
JOIN Vendors 
    ON Invoices.VendorID = Vendors.VendorID 
ORDER BY VendorName, FirstInvoiceDate 

这将使为了做同样的事情,并检查它是否存在,因此不会重新创建/每次定义。

感谢您对此的任何意见!

我约我把它直接出来的SQL Server,它通常被格式化以及格式道歉......

这是我得到了什么工作:

USE AP 
Declare @Create1 varchar(8000) 

IF EXISTS (SELECT * FROM sys.views Where sys.views.name = 'EarliestInvoiceandTotalVIEW') 
    drop view EarliestInvoiceandTotalVIEW; 

SET @CREATE1 = 'CREATE View EarliestInvoiceTotalVIEW AS 
Select VendorName, FirstInvoiceDate, InvoiceTotal 
From Invoices JOIN 
    (SELECT VendorID, MIN(InvoiceDate) AS FirstInvoiceDate 
    FROM Invoices 
    GROUP BY VendorID) AS FirstInvoice 
    ON (Invoices.VendorID = FirstInvoice.VendorID AND 
     Invoices.InvoiceDate = FirstInvoice.FirstInvoiceDate) 
JOIN Vendors 
    ON Invoices.VendorID = Vendors.VendorID' 

Exec (@CREATE1) 

我不得不设置在哪里sys.views.name = ...以及设置一个exec命令,以便创建视图运行'第一'。

+0

你的问题是什么? – Andomar

+0

第二部分为我提供了错误: Msg 102,Level 15,State 1,Line 4 '''附近的语法不正确。 Msg 111,Level 15,State 1,Line 6 'CREATE VIEW'必须是查询批处理中的第一条语句。 Msg 156,Level 15,State 1,Line 9 关键字'Create'附近的语法不正确。 Msg 111,Level 15,State 1,Line 9 'CREATE VIEW'必须是查询批处理中的第一条语句。 Msg 102,Level 15,State 1,Line 12 ')'附近语法不正确。 虽然我一直在研究这个问题,但我可能做错了什么。这是正确的或我在哪里搞乱? –

+0

您没有在'create'中指定视图名称,它应该是'create view [EarliestInvoiceandTotalVEW] --etc。' –

回答

1

在回答您的意见,要确保将您的视图定义与GO声明:

if exists (select * from sys.views where name = 'ThreeDigitsOfPi') 
    drop view dbo.ThreeDigitsOfPi 
GO 
create view dbo.ThreeDigitsOfPi 
as 
select 3.14 as PI 
GO 

的其他一些观点:

  • 你应该使用单引号的'代替风格报价
  • 您的观点必须有一个名称(create view NameOfView as ...
  • view定义不能跟随if语句,除非视图是在动态SQL中创建的。例如:if not exists (...) exec('create view ...')
1

有多种方法可以检查视图是否存在。然而,经常采取的办法是删除一个视图,如果它存在,然后重新创建它:

IF EXISTS (SELECT * FROM sys.views Where name = ‘EarliestInvoiceandTotalVEW’) 
    drop view EarliestInvoiceandTotalVEW; 

然后,你create view语句有两个缺陷。首先它缺乏一个名字。其次它嵌入了create view。您必须决定要创建哪一个 - 查看子查询或整个语句的视图(从正确的方法来看,我不清楚这个问题)。

+0

感谢您在正确的方向上引导我。最终,这是我的工作(没有得到秩序的工作(还?)) 我将编辑我的职位,我的工作。 –

+0

@DanielErb。 。 。除非你在视图本身中使用'top',否则视图中的''order's不能保证有任何效果。 –

相关问题