2014-09-05 173 views
2

我試圖在存儲過程中創建我的視圖,但是我遇到了一個錯誤。SQL Server:試圖在存儲過程中創建視圖

我的代碼是:

alter PROCEDURE p.Azmoon1 
    AS 
    begin 
     EXEC ('IF OBJECT_ID (''r.r_Sales01_Requests__Duplicates'', ''V'') IS NOT NULL 
      DROP VIEW r.r_Sales01_Requests__Duplicates ; 
      go 
      create view r.r_Sales01_Requests__Duplicates ( 
      CompanyID 
      ,Branch 
      ,Year 
      ,VoucherType,VoucherNumber 
      ,Date_Persian 
      ,Row 
     ) as 
     select 
      CompanyID 
      ,Branch 
      ,Year 
      ,VoucherType,VoucherNumber 
      ,Date_Persian 
      ,Row 
     from t_SalesRequests 
     group by CompanyID,Branch,Year,VoucherType,VoucherNumber,Date_Persian,Row 
     having count(*)>1 

     go 

    ') 
    end 

當我打電話給我的程序如下圖所示:

execute p.Azmoon1 

我得到了這些錯誤:近

不正確的語法 '走'
「 CREATE VIEW'必須是查詢批處理中的第一條語句。
超過最大存儲過程,函數,觸發器或視圖嵌套級別(限制32)。

+1

爲什麼要在存儲過程中創建視圖*沒有任何意義.... if你需要一個存儲過程中的視圖 - 你不能只是使用CTE(公用表表達式)嗎? – 2014-09-05 10:18:24

+1

錯誤的原因是'GO'是**不是一個有效的SQL關鍵字 - 它是一個在SQL Server ** Management Studio **中可用的分隔符... – 2014-09-05 10:19:03

+0

@marc_s我想在存儲過程中創建視圖,因爲我有近2500多個視圖來創建,並且我希望以後可以輕鬆更改它們的模式。 – 2014-09-05 10:24:09

回答

3

刪除「Go」作爲@mark_s正確地提到它不是在EXEC中可執行的SQL關鍵字。

我創建了下面的過程來修改視圖,就像你有很多。除了使用'Go'外,我正在使用兩個單獨的EXEC語句。

create procedure [dbo].[CreateInvoiceView] 
as 
begin 
    Exec ('If object_ID(''invoices'',''V'') is not null 
      drop view invoices;') 

    Exec (' 
     create view [dbo].[Invoices] AS 
      SELECT Orders.ShipName as SHIP_Name, Orders.ShipAddress, Orders.ShipCity, Orders.ShipRegion, Orders.ShipPostalCode,Orders.ShipCountry, Orders.CustomerID, Customers.CompanyName AS CustomerName, Customers.Address, Customers.City, Customers.Region, Customers.PostalCode, Customers.Country, (FirstName + '' '' + LastName) AS Salesperson, Orders.OrderID, Orders.OrderDate, Orders.RequiredDate, Orders.ShippedDate, Shippers.CompanyName As ShipperName 
      FROM Shippers INNER JOIN 
        (Products INNER JOIN 
         (
         (Employees INNER JOIN 
         (Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID) 
           ON Employees.EmployeeID = Orders.EmployeeID) 
           INNER JOIN "Order Details" ON Orders.OrderID = "Order Details".OrderID) 
           ON Products.ProductID = "Order Details".ProductID) 
           ON Shippers.ShipperID = Orders.ShipVia 

    ') 
end 
相關問題