Compartir a través de


ALTER PROCEDURE (Transact-SQL)

Modifica un procedimiento creado anteriormente mediante la ejecución de la instrucción CREATE PROCEDURE. ALTER PROCEDURE no cambia los permisos ni afecta a ningún procedimiento almacenado ni desencadenador dependientes. Sin embargo, la configuración de la sesión actual para QUOTED_IDENTIFIER y ANSI_NULLS se incluye en el procedimiento almacenado cuando se modifica. Si la configuración es distinta de la que se estaba aplicando cuando se creó originalmente el procedimiento almacenado, el comportamiento de este último puede cambiar.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL (Transact-SQL)

Sintaxis

--Transact-SQL Stored Procedure Syntax
ALTER { PROC | PROCEDURE } [schema_name.] procedure_name [ ;number ] 
    [ { @parameter [ type_schema_name. ] data_type } 
        [ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY]
    ] [ ,...n ] 
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ] 
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
[;]

<procedure_option> ::= 
    [ ENCRYPTION ]
    [ RECOMPILE ]
    [ EXECUTE AS Clause ]

--CLR Stored Procedure Syntax
ALTER { PROC | PROCEDURE } [schema_name.] procedure_name [ ;number ] 
    [ { @parameter [ type_schema_name. ] data_type } 
        [ = default ] [ OUT | OUTPUT ] [READONLY]
    ] [ ,...n ] 
[ WITH EXECUTE AS Clause ]
AS { EXTERNAL NAME assembly_name.class_name.method_name }
[;]

Argumentos

  • schema_name
    Es el nombre del esquema al que pertenece el procedimiento.

  • procedure_name
    Es el nombre del procedimiento que se va a cambiar. Los nombres de los procedimientos se deben ajustar a las reglas para los identificadores.

  • **;**number
    Es un entero opcional existente que se utiliza para agrupar los procedimientos del mismo nombre, de forma que puedan quitarse juntos mediante una sola instrucción DROP PROCEDURE.

    [!NOTA]

    Esta característica se quitará en una versión futura de Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.

  • **@**parameter
    Es un parámetro del procedimiento. Se pueden especificar hasta 2.100 parámetros.

  • [ type_schema_name**.** ] data_type
    Es el tipo de datos del parámetro y el esquema al que pertenece.

    Para obtener información acerca de las restricciones a los tipos de datos, vea CREATE PROCEDURE (Transact-SQL).

  • VARYING
    Especifica el conjunto de resultados admitido como parámetro de salida. Este parámetro se genera dinámicamente por medio del procedimiento almacenado y su contenido puede variar. Solo se aplica a los parámetros de cursor.

  • default
    Es un valor predeterminado para el parámetro.

  • OUT | OUTPUT
    Indica que se trata de un parámetro devuelto.

  • READONLY
    Indica que el parámetro no se puede actualizar ni modificar en el cuerpo del procedimiento. Si el tipo de parámetro es un tipo con valores de tabla, se debe especificar READONLY.

  • RECOMPILE
    Indica que SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) no almacena en la memoria caché un plan para este procedimiento y el procedimiento se vuelve a compilar en tiempo de ejecución.

  • ENCRYPTION
    Indica que Database Engine (Motor de base de datos) convertirá el texto original de la instrucción ALTER PROCEDURE en un formato protegido. La salida de la protección no es directamente visible en ninguna de las vistas de catálogo de SQL Server 2005. Los usuarios que no disponen de acceso a las tablas del sistema o a los archivos de base de datos no pueden recuperar el texto protegido. Sin embargo, estará disponible para los usuarios con privilegios que puedan obtener acceso a las tablas del sistema a través del puerto DAC o directamente a los archivos de base de datos. Además, los usuarios que pueden adjuntar un depurador al proceso del servidor pueden recuperar el procedimiento original de la memoria en tiempo de ejecución. Para obtener más información acerca del acceso a los metadatos del sistema, vea Configuración de visibilidad de los metadatos.

    Los procedimientos creados mediante esta opción no se pueden publicar como parte de la replicación de SQL Server.

    Esta opción no se puede especificar para procedimientos almacenados de Common Language Runtime (CLR).

    [!NOTA]

    Durante una actualización, Database Engine (Motor de base de datos) utiliza los comentarios protegidos almacenados en sys.sql_modules para volver a crear los procedimientos.

  • EXECUTE AS
    Especifica el contexto de seguridad en el que se debe ejecutar el procedimiento almacenado una vez que se obtiene acceso al mismo.

    Para obtener más información, vea EXECUTE AS (cláusula de Transact-SQL).

  • FOR REPLICATION
    Especifica que los procedimientos almacenados creados para la replicación no se pueden ejecutar en el suscriptor. Se utiliza un procedimiento almacenado creado con la opción FOR REPLICATION como un filtro de procedimiento almacenado y solo se ejecuta durante la replicación. No se pueden declarar los parámetros si se especifica FOR REPLICATION. La opción RECOMPILE se pasa por alto en el caso de procedimientos creados con FOR REPLICATION.

  • AS
    Son las acciones que va a llevar a cabo el procedimiento.

  • <sql_statement>
    Es cualquier número y tipo de instrucciones Transact-SQL que se incluirán en el procedimiento. Tiene algunas limitaciones. Para obtener más información, vea "Limitaciones de <sql_statement>" en CREATE PROCEDURE (Transact-SQL).

  • EXTERNAL NAME assembly_name**.class_name.method_name
    Especifica el método de un ensamblado de Microsoft.NET Framework para que un procedimiento almacenado CLR haga referencia a él. class_name debe ser un identificador válido de SQL Server y debe existir como una clase en el ensamblado. Si la clase tiene un nombre calificado como espacio de nombres que utiliza un punto (
    .) para separar las partes del espacio de nombres, el nombre de la clase debe estar delimitado por corchetes ([** ]) o comillas (" "). El método especificado debe ser un método estático de la clase.

    [!NOTA]

    De manera predeterminada, SQL Server no puede ejecutar código CLR. Se puede crear, modificar y quitar objetos de bases de datos que hagan referencia a módulos de Common Language Runtime; sin embargo, estas referencias no se ejecutarán en SQL Server hasta que se habilite la opción clr enabled. Para habilitar esta opción, utilice sp_configure.

Notas

Los procedimientos almacenados de Transact-SQL no se pueden modificar a procedimientos almacenados de CLR y viceversa.

Para obtener más información, vea la sección Notas en CREATE PROCEDURE (Transact-SQL).

[!NOTA]

Si anteriormente se creó una definición de procedimiento mediante WITH ENCRYPTION o WITH RECOMPILE, estas opciones solo se activan si se incluyen en ALTER PROCEDURE.

Permisos

Es necesario contar con un permiso de tipo ALTER sobre el procedimiento.

Ejemplos

En el siguiente ejemplo se crea el procedimiento almacenado uspVendorAllInfo. Este procedimiento devuelve los nombres de todos los proveedores que proporciona Adventure Works Cycles, los productos que suministran, su solvencia y su disponibilidad. Después de crear este procedimiento, el mismo se modifica para devolver un conjunto de resultados diferente.

USE AdventureWorks;
GO
IF OBJECT_ID ( 'Purchasing.uspVendorAllInfo', 'P' ) IS NOT NULL 
    DROP PROCEDURE Purchasing.uspVendorAllInfo;
GO
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 'Credit Rating', 
      v.ActiveFlag AS Availability
    FROM Purchasing.Vendor v 
    INNER JOIN Purchasing.ProductVendor pv
      ON v.VendorID = pv.VendorID 
    INNER JOIN Production.Product p
      ON pv.ProductID = p.ProductID 
    ORDER BY v.Name ASC;
GO

En el ejemplo siguiente se modifica el procedimiento almacenado uspVendorAllInfo (sin la opción EXECUTE AS) de forma que devuelva solo los proveedores que suministran el producto especificado. Las funciones LEFT y CASE permiten personalizar la apariencia del conjunto de resultados.

ALTER PROCEDURE Purchasing.uspVendorAllInfo
    @Product varchar(25) 
AS
    SELECT LEFT(v.Name, 25) AS Vendor, LEFT(p.Name, 25) AS 'Product name', 
    'Credit 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.VendorID = pv.VendorID 
    INNER JOIN Production.Product AS p 
      ON pv.ProductID = p.ProductID 
    WHERE p.Name LIKE @Product
    ORDER BY v.Name ASC;
GO
EXEC Purchasing.uspVendorAllInfo N'LL Crankarm';
GO

Éste es el conjunto de resultados.

Vendor               Product name        Credit rating Availability
-------------------- ------------------- ------------- ------------
Proseware, Inc.      LL Crankarm         Average       No
Vision Cycles, Inc.  LL Crankarm         Superior      Yes

(2 row(s) affected)

Vea también

Tasks

Referencia

Conceptos

Otros recursos