Sql-Server
儲存過程 - Reseed Identity
我有一堆一直在添加和刪除值的 LU 表。因此,我認為編寫一個快速的儲存過程會很好地為我服務,然後可以在另一個儲存過程上呼叫該儲存過程,該儲存過程從 LU 表中刪除值,然後
ID
直接在之後重新設置該列的種子。儲存過程程式碼
Create Procedure DBA.ReseedIdentity @TableName nvarchar(20) = NULL, @IdentityColumn nvarchar(25) = NULL AS BEGIN SET NOCOUNT ON SET XACT_ABORT ON IF (@TableName is null or @IdentityColumn is null) BEGIN RAISERROR('You Must Specify a Table AND the ID Column from that Table to Reseed the Identity!', 16,1) RETURN; END Declare @MaxID int set @MaxID = (SELECT ISNULL(MAX(@IdentityColumn),0) FROM @TableName) DBCC CHECKIDENT(@TableName, RESEED, @MaxID) END
我想知道是否有任何技巧可以在不動態創建子句
@TableName
的情況下傳遞參數。FROM
我是編寫儲存過程的新手,所以如果答案很明顯,請原諒我。任何幫助是極大的讚賞。
- 如果您要從查找表中完全刪除所有值,您是否考慮過截斷它們?這將節省 TLOG 活動並自動重新設定值。
- 您不能在查詢中替換類似的參數,至少不能替換對象名稱。您需要動態執行此操作。
- 請參閱下面的範例。對於您可能沒有考慮過的邊緣情況,我為您加強了健全性檢查……希望以下內容很清楚。
CREATE PROCEDURE DBA.ReseedIdentity ( @TableName SYSNAME , @IdentityColumn SYSNAME ) AS BEGIN /** Sanity Checking **/ IF @TableName IS NULL OR @IdentityColumn IS NULL BEGIN ;THROW 50000, 'Must specify table name and Identity column name.', 1; END IF OBJECT_ID(@TableName) IS NULL BEGIN ;THROW 50000, 'Tablename does not exist.', 1; END IF NOT EXISTS (SELECT TOP (1) 1 FROM sys.columns AS C WHERE C.name = @IdentityColumn AND C.object_id = OBJECT_ID(@TableName)) BEGIN ;THROW 50000, 'Identity column is not found on specified table.', 1; END /** Reset Identity Assumes Identity column is an INT **/ DECLARE @SQLCommand NVARCHAR(4000) SET @SQLCommand = N' DECLARE @MaxID INT; SET @MaxID = COALESCE((SELECT MAX(' + QUOTENAME(@IdentityColumn) + ') FROM ' + QUOTENAME(@TableName) + '), 1); DBCC CHECKIDENT(' + QUOTENAME(@TableName, '''') + ', RESEED, @MaxID); '; EXEC sp_executesql @SQLCommand; END