修改存储过程

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)

本文介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中修改存储过程。

限制

Transact-SQL 存储过程修改为 CLR 存储过程,反之亦然。

如果原来的过程定义是使用 WITH ENCRYPTIONWITH RECOMPILE 创建的,那么只有在 ALTER PROCEDURE 语句中也包含这些选项时,这些选项才有效。

权限

要求对过程具有 ALTER PROCEDURE 权限。

使用 SQL Server Management Studio

若要在 Management Studio 中修改过程:

  1. 在对象资源管理器中,连接到 数据库引擎 的实例,然后展开该实例。

  2. 展开 “数据库” 、过程所属的数据库以及 “可编程性”

  3. 展开“存储过程”,右键单击要修改的过程,再选择“修改”

  4. 修改存储过程的文本。

  5. 若要测试语法,请在“查询”菜单上选择“分析”

  6. 若要将修改项保存到过程定义中,请在“查询”菜单上选择“执行”

  7. 若要将更新后的过程定义另存为 Transact-SQL 脚本,请在“文件”菜单上选择“另存为”。 接受该文件名或将其替换为新的名称,再选择“保存”

重要

验证所有用户的输入。 验证前请勿连接用户输入。 绝对不要执行根据尚未验证的用户输入构造的命令。 未经评估的用户输入会使数据库容易受到称为“SQL 注入攻击”的一种攻击。 有关详细信息,请参阅 SQL 注入

使用 Transact-SQL

若要使用 T-SQL 命令修改过程:

  1. “对象资源管理器” 中,连接到 数据库引擎 的实例,然后展开该实例。

  2. 展开 “数据库” ,然后展开过程所属的数据库。 或者,在工具栏上,从可用数据库列表中选择该数据库。 对于此示例,选择 AdventureWorks2022 数据库。

  3. 在“文件”菜单上,选择“新建查询”

  4. 复制以下示例并将其粘贴到查询编辑器中。 该示例创建 Purchasing.uspVendorAllInfo 过程,该过程返回 Adventure Works Cycles 数据库中所有供应商的名称、所提供的产品、信用等级以及可用性。

    CREATE PROCEDURE Purchasing.uspVendorAllInfo  
    WITH EXECUTE AS CALLER  
    AS  
        SET NOCOUNT ON;  
        SELECT v.Name AS Vendor, p.Name AS 'Product name',   
          v.CreditRating AS 'Rating',   
          v.ActiveFlag AS Availability  
        FROM Purchasing.Vendor v   
        INNER JOIN Purchasing.ProductVendor pv  
          ON v.BusinessEntityID = pv.BusinessEntityID   
        INNER JOIN Production.Product p  
          ON pv.ProductID = p.ProductID   
        ORDER BY v.Name ASC;  
    GO   
    
  5. 在“文件”菜单上,选择“新建查询”

  6. 复制以下示例并将其粘贴到查询编辑器中。 该示例修改 uspVendorAllInfo 过程。 这会删除 EXECUTE AS CALLER 子句,并且将过程的主体修改为只返回提供指定产品的供应商。 LEFTCASE 函数自定义结果集的外观。

    重要

    删除再重新创建现有存储过程是,会删除已显式授予该存储过程的权限。 改用 ALTER 修改现有存储过程。

    ALTER PROCEDURE Purchasing.uspVendorAllInfo  
        @Product varchar(25)   
    AS  
        SET NOCOUNT ON;  
        SELECT LEFT(v.Name, 25) AS Vendor, LEFT(p.Name, 25) AS 'Product name',   
        'Rating' = CASE v.CreditRating   
            WHEN 1 THEN 'Superior'  
            WHEN 2 THEN 'Excellent'  
            WHEN 3 THEN 'Above average'  
            WHEN 4 THEN 'Average'  
            WHEN 5 THEN 'Below average'  
            ELSE 'No rating'  
            END  
        , Availability = CASE v.ActiveFlag  
            WHEN 1 THEN 'Yes'  
            ELSE 'No'  
            END  
        FROM Purchasing.Vendor AS v   
        INNER JOIN Purchasing.ProductVendor AS pv  
          ON v.BusinessEntityID = pv.BusinessEntityID   
        INNER JOIN Production.Product AS p   
          ON pv.ProductID = p.ProductID   
        WHERE p.Name LIKE @Product  
        ORDER BY v.Name ASC;  
    GO  
    
  7. 若要将修改项保存到过程定义中,请在“查询”菜单上选择“执行”

  8. 若要将更新后的过程定义另存为 Transact-SQL 脚本,请在“文件”菜单上选择“另存为”。 接受该文件名或将其替换为新的名称,再选择“保存”

  9. 若要运行修改的存储过程,请执行以下示例。

    EXEC Purchasing.uspVendorAllInfo N'LL Crankarm';  
    GO