共用方式為


sp_refreshsqlmodule (Transact-SQL)

新增: 2006 年 12 月 12 日

針對非結構描述繫結預存程序、使用者自訂函數或檢視,更新其中繼資料。這些物件的基礎物件變更之後,其保存中繼資料也可能會過期,例如參數的資料類型。

主題連結圖示Transact-SQL 語法慣例

語法

sp_refreshsqlmodule [ @name = ] 'module_name' 

引數

  • [ @name= ] 'module_name'
    這是預存程序、函數或檢視的名稱。module_name 不能是 Common Language Runtime (CLR) 預存程序或 CLR 函數。module_name 不能是結構描述繫結。module_namenvarchar,沒有預設值。module_name 可以是多部分組成的識別碼,但只能參考目前資料庫中的物件。

傳回碼值

0 (成功) 或非零值 (失敗)

備註

sp_refreshsqlmodule 應在預存程序、使用者自訂函數或檢視的基礎物件變更而影響其定義時執行。否則,在查詢或叫用物件時,可能會產生非預期的結果。若要重新整理檢視,您可以使用 sp_refreshsqlmodulesp_refreshview 來重新整理相同的結果。

sp_refreshsqlmodule 不會影響與物件相關聯的任何權限、擴充屬性或 SET 選項。

當您執行 sp_refreshsqlmodule 時,會卸除與物件相關聯的任何簽章。

權限

必須對預存程序、函數或檢視具備 ALTER 權限,以及對物件所參考的 CLR 使用者自訂類型和 XML 結構描述集合,具備 REFERENCES 權限。

此外,對於使用 EXECUTE AS 子句定義的模組,也必須對指定的主體具備 IMPERSONATE 權限。一般而言,重新整理物件不會變更其 EXECUTE AS 主體,除非模組是使用 EXECUTE AS USER 定義,而且主體的使用者名稱這時解析出來不是模組建立當時的使用者。

範例

下列範例會重新整理使用者自訂函數。這個範例會建立別名資料類型 mytype,以及使用 mytype 的使用者自訂函數 to_upper。接著,mytype 會重新命名為 myoldtype,而且會建立有不同定義的新 mytypeto_upper 函數會重新整理,以參考 mytype 的新實作,而非舊實作。

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

請參閱

參考

sp_refreshview (Transact-SQL)
Database Engine 預存程序 (Transact-SQL)

說明及資訊

取得 SQL Server 2005 協助