Compartir a través de


sp_refreshsqlmodule (Transact-SQL)

Nuevo: 12 de diciembre de 2006

Actualiza los metadatos para el procedimiento almacenado enlazado no a esquema, la función definida por el usuario o la vista especificados. Los metadatos persistentes de estos objetos, como los tipos de datos de los parámetros, pueden quedarse obsoletos debido a los cambios en sus objetos subyacentes.

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

Sintaxis

sp_refreshsqlmodule [ @name = ] 'module_name' 

Argumentos

  • [ @name= ] 'module_name'
    Es el nombre del procedimiento almacenado, la función o la vista. module_name no puede ser un procedimiento almacenado o una función CLR (Common Language Runtime). module_name no puede estar enlazado al esquema. module_name es de tipo nvarchar y no tiene valor predeterminado. module_name puede ser un identificador de varias partes, pero sólo puede hacer referencia a los objetos de la base de datos actual.

Notas

sp_refreshsqlmodule se debería ejecutar cuando se realizan cambios en los objetos subyacentes del procedimiento almacenado, la función definida por el usuario o la vista que afecta a su definición. De lo contrario, el objeto podría producir resultados inesperados cuando se consulta o se invoca. Para actualizar una vista, puede usar sp_refreshsqlmodule o sp_refreshview con los mismos resultados.

sp_refreshsqlmodule no afecta a ningún permiso, propiedad extendida u opción SET que esté asociado al objeto.

Las firmas asociadas al objeto se anulan al ejecutar sp_refreshsqlmodule.

Permisos

Requiere el permiso ALTER en el procedimiento almacenado, la función o la vista, y el permiso REFERENCES en los tipos definidos por el usuario CLR y las colecciones de esquemas XML a los que hace referencia el objeto.

Además, en los módulos definidos con la cláusula EXECUTE AS, es necesario el permiso IMPERSONATE en la entidad de seguridad especificada. Generalmente, al actualizar un objeto no se cambia su entidad de seguridad EXECUTE AS, a menos que el módulo se defina con EXECUTE AS USER y el nombre de usuario de la entidad de seguridad se resuelva ahora como un usuario diferente del usado en el momento en que se creó el módulo.

Valores de código de retorno

0 (correcto) o un número distinto de cero (error)

Ejemplos

En el ejemplo siguiente se actualiza una función definida por el usuario. En el ejemplo se crea un tipo de datos de alias, mytype, y una función definida por el usuario, to_upper, que usa mytype. Entonces, el nombre de mytype se cambia a myoldtype, y se crea un nuevo mytype que tiene una definición diferente. La función to_upper se actualiza para que haga referencia a la nueva implementación de mytype, en lugar de a la antigua.

-- Create an alias type.
USE AdventureWorks;
GO
IF EXISTS (SELECT 'mytype' FROM sys.types WHERE name = 'mytype')
DROP TYPE mytype;
GO

CREATE TYPE mytype FROM nvarchar(5);
GO

IF OBJECT_ID ('to_upper', 'FN') IS NOT NULL
DROP FUNCTION to_upper;
GO

CREATE FUNCTION to_upper (@a mytype)
RETURNS mytype
WITH ENCRYPTION
AS
BEGIN
RETURN upper(@a)
END;
GO

SELECT dbo.to_upper('abcde');
GO

-- Increase the length of the alias type.
sp_rename 'mytype', 'myoldtype', 'userdatatype';
GO

CREATE TYPE mytype FROM nvarchar(10);
GO

-- The function parameter still uses the old type.
SELECT name, type_name(user_type_id) 
FROM sys.parameters 
WHERE object_id = OBJECT_ID('dbo.to_upper');
GO

SELECT dbo.to_upper('abcdefgh'); -- Fails because of truncation
GO

-- Refresh the function to bind to the renamed type.
EXEC sys.sp_refreshsqlmodule 'dbo.to_upper';

-- The function parameters are now bound to the correct type and the statement works correctly.
SELECT name, type_name(user_type_id) FROM sys.parameters
WHERE object_id = OBJECT_ID('dbo.to_upper');
GO

SELECT dbo.to_upper('abcdefgh');
GO

Vea también

Referencia

sp_refreshview (Transact-SQL)
Procedimientos almacenados del motor de base de datos (Transact-SQL)

Ayuda e información

Obtener ayuda sobre SQL Server 2005