SQL Server:尝试在存储过程中创建视图

3
我是一名有用的助手,可以为您进行文本翻译。
我正在尝试在存储过程中创建视图,但遇到了错误。
我的代码如下:
    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 

我收到了以下错误:

语法不正确,附近有'go'
'CREATE VIEW'必须是查询批处理中的第一条语句。
存储过程、函数、触发器或视图的最大嵌套级别超过限制32。


1
为什么你想要在存储过程内创建一个视图?这没有任何意义...如果你需要在存储过程内使用视图,难道不能使用CTE(公共表达式)吗? - marc_s
1
错误的原因是GO不是一个有效的SQL关键字 - 它只是在SQL Server Management Studio中可用的分隔符。 - marc_s
@marc_s 我想在存储过程中创建视图,因为我几乎有超过2500个视图要创建,并且我希望稍后可以轻松地更改它们的模式。 - Arash
什么?你为什么要从存储过程中创建视图的解释根本就没有任何意义。从存储过程中创建视图如何使以后更容易更改模式? - Sean Lange
我将我的视图创建为存储过程,该存储过程有两个参数,即SchemaName和ViewName。我将调用我的存储过程,例如执行过程@schema,@viewName,并创建我的视图。如果我想要更改所有视图的模式,我只需要更改变量(@schema)的值即可更改它。 - Arash
你确定可以将视图名称作为变量传递吗? - paparazzo
1个回答

5

正如@mark_s所指出的,"Go"不是可在EXEC中执行的SQL关键字。因此请将其删除。

我创建了下面的存储过程来修改视图,就像你所做的一样。但是,我使用两个单独的EXEC语句而不是使用'Go'。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接