Sql-Server

儲存過程 - Reseed Identity

  • May 22, 2019

我有一堆一直在添加和刪除值的 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我是編寫儲存過程的新手,所以如果答案很明顯,請原諒我。

任何幫助是極大的讚賞。

  1. 如果您要從查找表中完全刪除所有值,您是否考慮過截斷它們?這將節省 TLOG 活動並自動重新設定值。
  2. 您不能在查詢中替換類似的參數,至少不能替換對象名稱。您需要動態執行此操作。
  3. 請參閱下面的範例。對於您可能沒有考慮過的邊緣情況,我為您加強了健全性檢查……希望以下內容很清楚。
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

引用自:https://dba.stackexchange.com/questions/238733