اکثر توسعه دهنده گان و برنامه نویسان از متغیر سیستمی IDENTITY@@ برای بدست آوردن مقدار ستون IDENTITY بلافاصله بعد از درج استفاده می کنند. اما آیا اگر PK جدولمان از نوع GUID باشد تابعی برای بدست آوردن آخرین مقدار درج شده وجود دارد؟ متاسفانه جواب منفی است. ولی در ادامه به برخی از ایده ها برای بدست آوردن آخرین GUID تولید شده در جدول اشاره خواهد شد.
ایده ی اول:
با تابع ()NEWID می توانید یک مقدار GUID تولید کنید. اگر قبل از درج در جدول مقدار این تابع را به یک متغیر انتساب دهید پس از درج در جدول می توانید مقدار آن متغیر را انتخاب کنید.
در اینجا اسکریپت جدول آزمایشی و SP برای درج و دستوراتی برای اجرای SP آورده شده است:
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 درج شده در جدول را بلافاصله بعد از درج به نمایش در آورید.
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 ارسال کنید.
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

پیوند ها