بدست آوردن آخرین GUID تولید شده در جدول
  هنگامی که کلید اصلی جدولمان از نوع GUID باشد دیگر تابعی مثل IDENTITY@@ وجود ندارد که آخرین مقدار را برگرداند. این مقاله به این موضوع اختصاص دارد.
   SQL Server
   ۱۸۵۹۸
   این مقاله حاوی فایل ضمیمه نمی باشد
   محمد سلیم آبادی
   ۱۳۸۸/۱۲/۷
ارسال لینک صفحه برای دوستان ارسال لینک صفحه برای دوستان  اضافه کردن به علاقه مندیها اضافه کردن به علاقه مندیها   نسخه قابل چاپ نسخه قابل چاپ

 

اکثر توسعه دهنده گان و برنامه نویسان از متغیر سیستمی  IDENTITY@@ برای بدست آوردن مقدار ستون IDENTITY بلافاصله بعد از درج استفاده می کنند. اما آیا اگر PK جدولمان از نوع GUID باشد تابعی برای بدست آوردن آخرین مقدار درج شده وجود دارد؟ متاسفانه جواب منفی است. ولی در ادامه به برخی از ایده ها برای بدست آوردن آخرین GUID تولید شده در جدول اشاره خواهد شد.

ایده ی اول:

با تابع ()NEWID می توانید یک مقدار GUID تولید کنید. اگر قبل از درج در جدول مقدار این تابع را به یک متغیر انتساب دهید پس از درج در جدول می توانید مقدار آن متغیر را انتخاب کنید.
در اینجا اسکریپت جدول آزمایشی و
SP برای درج و دستوراتی برای اجرای SP آورده شده است:

 

--Table structure
CREATE TABLE dbo.GUIDTable
(
    GUIDCol uniqueidentifier NOT NULL PRIMARY KEY,
    OtherColumn varchar(25) NOT NULL

)
GO



--Stored procedure for inserting rows
CREATE PROCEDURE dbo.InsertGUIDs
(
    @OtherColumn varchar(25)
)
AS
BEGIN
    SET NOCOUNT ON

    DECLARE @GUIDCol uniqueidentifier

    SET @GUIDCol = NEWID() --Creating the new GUID value before hand

    INSERT INTO dbo.GUIDTable (GUIDCol, OtherColumn) VALUES (@GUIDCol, @OtherColumn)

    IF @@ERROR = 0 AND @@ROWCOUNT = 1
    BEGIN
        /* This GUID will be returned to the client as a recordset */
        SELECT @GUIDCol AS '@@GUID'
        RETURN 0
    END
    ELSE
    BEGIN
        RAISERROR('Something went wrong :-(', 16, 1)
        RETURN -1
    END
END
GO



--Sample calls to the stored procedure
EXEC dbo.InsertGUIDs 'SQL Cluster'
EXEC dbo.InsertGUIDs 'Replication'
EXEC dbo.InsertGUIDs 'Network Load Balancing'
EXEC dbo.InsertGUIDs 'NLB & Cicso'
EXEC dbo.InsertGUIDs 'Oracle, Sybase, DB2'
GO

 

 

ایده ی دوم:

در صورتی که از SQL Server 2005 و بالاتر استفاده می کنید با کمک ماده ی OUTPUT و پیشوند inserted می توانید مقدار GUID درج شده در جدول را بلافاصله بعد از درج به نمایش در آورید.

 

--Table structure
CREATE TABLE dbo.GUIDTable2
(
    GUIDCol uniqueidentifier NOT NULL PRIMARY KEY DEFAULT (NEWID()),
    OtherColumn varchar(25) NOT NULL
)
GO


--Stored procedure for inserting rows
CREATE PROCEDURE dbo.InsertGUIDs2
(
    @OtherColumn varchar(25)
)
AS
BEGIN
    SET NOCOUNT ON

    INSERT INTO dbo.GUIDTable2 (OtherColumn)
    OUTPUT inserted.GUIDCol
    VALUES (@OtherColumn)
END
GO

--Sample calls to the stored procedure
EXEC dbo.InsertGUIDs2 'Index Tuning'
EXEC dbo.InsertGUIDs2 'Optimization'
 

 

ایده ی سوم:

تابع ()NEWID را به عنوان مقدار پیشفرض برای ستون اصلی جدول در نظر بگیرید (دقیقا همان جدول dbo.GUIDTable2) و یک AFTER TRIGGER روی جدول ایجاد کنید و مقدار GUID را به Client ارسال کنید.

--Insert trigger that returns a recordset containing the generated GUIDs to client
CREATE TRIGGER dbo.InsertTriggerOnGUIDTable2
ON dbo.GUIDTable2
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON

    SELECT GUIDCol AS '@@GUID'
    FROM inserted
END
GO


--Sample INSERT statements:
INSERT INTO dbo.GUIDTable2 (OtherColumn) VALUES ('Performance tuning')
INSERT INTO dbo.GUIDTable2 (OtherColumn) VALUES ('NAS and EMC SAN')
INSERT INTO dbo.GUIDTable2 (OtherColumn) VALUES ('Alerts and Thresholds')
INSERT INTO dbo.GUIDTable2 (OtherColumn) VALUES ('BCP, DTS! which is best?')
INSERT INTO dbo.GUIDTable2 (OtherColumn) VALUES ('SQL Server on IIS')
INSERT INTO dbo.GUIDTable2 (OtherColumn) VALUES ('Web Server Performance')

INSERT INTO dbo.GUIDTable2 (OtherColumn)
SELECT 'xp_sendmail problems!'
UNION ALL
SELECT 'SQL Mail or SMTP Mail?'
UNION ALL
SELECT 'SQL Reserved Words'
GO

 

ایده ی چهارم:

از تابع NEWSEQUENTIALID به عنوان مقدار پیشفرض برای ستون استفاده کنید. این تابع GUID ای تولید می کند که از آخرین GUID تولید شده در آن سیستم بزرگتر است. برای بدست آوردن آخرین GUID کافیه که بزرگترین GUID موجود در جدول را بدست آورید. البته تابع MAX روی مقادیر از نوع UNIQUEIDENTIFIER عمل نمی کنند. به جای آن از روشهای جایگزین MAX استفاده کنید بطور مثال استفاده از دو ماده ی TOP و ORDER BY بطور همزمان.
از این تابع تنها در قیود پیشفرض می توانید استفاده کنید.

ایده ی پنجم:

یک ستون از نوع datatime با مقدار پیشفرض getdate به جدول اضافه کرده. با این کار به آخرین رکورد تولید شده در جدول می توانید پی ببرید.

ایده ی ششم:

بجای اینکه این مقدار را در Server تولید کنید و به Client بازگردانید آن را در همان Client تولید کنید.

 

مرجع:

http://vyaskn.tripod.com/retrieve_guid_value_like_identity.htm