چگونه در SQL Server شناسه ردیف تازه درج شده را بگیریم؟
در SQL Server، برای دریافت شناسه (IDENTITY) ردیفهایی که به تازگی درج شدهاند، چندین گزینه وجود دارد که هرکدام کاربردها و محدودیتهای خاص خود را دارند. مهمترین آنها @@IDENTITY
، IDENT_CURRENT
و SCOPE_IDENTITY()
هستند.
@@IDENTITY
شناسه آخرین مقدار درج شده برای هر جدول در سشن جاری را باز میگرداند و برای تمامی دامنهها (scopes) عمل میکند. به همین دلیل، این تابع میتواند مقادیر ناخواستهای را برگرداند، مثلاً اگر یک trigger یک ردیف جدید را درج کرده باشد، آن شناسه به جای شناسه ردیف درج شده برمیگردد. به همین دلیل، استفاده از این گزینه در سناریوهایی که ممکن است برای جدول مورد نظر تریگر تعریف شده باشد، مناسب نیست.
در مقابل، IDENT_CURRENT
آخرین شناسه ایجادشده برای یک جدول خاص را برمیگرداند، بدون توجه به اینکه چه کسی این ردیف را درج کرده است. بنابراین، اگر دو یا چند کاربر در زمان مشابه ردیفهایی را درج کنند، احتمال دارد شما شناسه یک ردیف که توسط کاربر دیگر درج شده باشد را دریافت کنید. این روش نیز در مواردی که دقت در شناسایی مهم است، توصیه نمیشود.
بهترین و امنترین گزینه برای دریافت شناسایی ردیف درج شده SCOPE_IDENTITY()
است. این تابع شناسه آخرین ردیف درج شده توسط دستور SQL در همان اسکوپ را برمیگرداند. بنابراین اگر چند کاربر در حین همزمانی ردیفهایی را درج کنند، هر کاربر شناسه مربوط به خود را دریافت خواهد کرد. به همین دلیل، این گزینه در اکثر موارد پیشنهاد میشود.
علاوه بر اینها، استفاده از عبارت OUTPUT
نیز یک روش بسیار کارآمد برای دریافت شناسه ردیفهای درج شده است. به عنوان مثال:
USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table( NewScrapReasonID smallint,
Name varchar(50),
ModifiedDate datetime);
INSERT Production.ScrapReason
OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
INTO @MyTableVar
VALUES (N'Operator error', GETDATE());
در این کد، یک متغیر جدول تعریف شده است و با درج ردیف جدید، مقادیر شناسه، نام و تاریخ ویرایش بعنوان خروجی برگردانده می شوند.