今天收到一個需求得修改資料表值參數類型的欄位長度,但使用者定義資料表值參數類型無法使用Alter來異動,只能Drop後Create來異動。一旦該Table Type有被Stored Procedure參照的話,我們還無法Drop掉…….
上網爬了一下最好的做法就是建立新的Table Type後再做rename動作,最後再用sys.sp_refreshsqlmodule
關聯Stored Procedure跟Table Type回來。
步驟一 先將舊的Table Type給Rename掉。
步驟二 建立新的Table Type(用舊Table Type的名子)。
步驟三 用sys.sp_refreshsqlmodule
關聯Stored Procedure跟新建立的Table Type回來。
步驟四 砍掉舊的Table Type。
以下為程式碼範例
--舊的Table Type給Rename掉
EXEC sys.sp_rename 'dbo.EmpNoArray', 'zEmpNoArray';
GO
--建立新的Table Type
CREATE TYPE [dbo].[EmpNoArray] AS TABLE(
[item] [nvarchar](10) NULL
);
GO
--關聯Stored Procedure跟新建立的Table Type回來
DECLARE @Name NVARCHAR(776);
DECLARE REF_CURSOR CURSOR FOR
SELECT referencing_schema_name + '.' + referencing_entity_name
FROM sys.dm_sql_referencing_entities('dbo.EmpNoArray', 'TYPE');
OPEN REF_CURSOR;
FETCH NEXT FROM REF_CURSOR INTO @Name;
WHILE (@@FETCH_STATUS = 0)
BEGIN
EXEC sys.sp_refreshsqlmodule @name = @Name;
FETCH NEXT FROM REF_CURSOR INTO @Name;
END;
CLOSE REF_CURSOR;
DEALLOCATE REF_CURSOR;
GO
--砍掉舊的Table Type
DROP TYPE dbo.zEmpNoArray;
GO
我是ROCK
rockchang@mails.fju.edu.tw