اکثر توسعه
دهنده گان و برنامه
نویسان
از متغیر سیستمی
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