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

Posted

技术标签:

【中文标题】SQL Server:尝试在存储过程中创建视图【英文标题】:SQL Server: trying to create view inside a stored procedure 【发布时间】:2014-09-05 10:09:20 【问题描述】:

我试图在存储过程中创建我的视图,但我遇到了一个错误。

我的代码是:

    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)。

【问题讨论】:

为什么要在存储过程内部创建视图?没有任何意义....如果您需要存储过程中的视图 - 您不能只使用 CTE(公用表表达式)吗? 错误原因是GO 不是有效的 SQL 关键字 - 它是 SQL Server Management Studio中可用的分隔符> 只有.... @marc_s 我想在存储过程中创建视图,因为我有将近 2500 个视图要创建,我想稍后轻松更改它们的架构。 嗯?您对为什么要从存储过程创建视图的解释根本没有任何意义。从存储过程创建视图如何使以后更容易更改架构? 我将视图创建为具有 2 个参数的存储过程,即 SchemaName 和 ViewName,我将调用我的存储过程,例如 Execute procedure @schema,@viewName,如果我想更改,我将创建我的视图我所有的视图模式我只需要改变我的变量(@schema)值来改变它, 【参考方案1】:

删除“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

【讨论】:

以上是关于SQL Server:尝试在存储过程中创建视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在sql server中创建一个存储过程中的varchar型的输入参数默认值为空

如何在存储过程中创建视图

在 SQL Server Management Studio 中创建存储过程时出现语法错误

sql中创建关于更新的存储过程

无法在 GeoServer 中创建 SQL Server 数据存储

在 SQL Server 中使用存储过程提取值 [关闭]