2010-08-11 13 views
7

मैं एक प्रश्न के साथ परेशान हूं।अनन्य पहचानकर्ता के साथ डाली गई अंतिम पंक्ति को पुनर्प्राप्त करें कि यह पहचान नहीं है

मैं अंतिम पंक्ति डेटाप्रकार UniqueIdentifier स्तंभ के साथ एक कॉलम के साथ एक मेज में जोड़ा पता लगाने के जरूरत है: aspnet_Applications.ApplicationId नोट: यह UniqueIdentifier यह कॉलम नहीं और पहचान स्तंभ है।

मैं भी पिछले पंक्ति सम्मिलित लेने के लिए और एक अलग तालिका aspnet_Users.ApplicationId

मैं एमएस एसक्यूएल 2008 में SCOPE_IDENTITY उपयोग करने के लिए कोशिश की, लेकिन क्योंकि SCOPE_IDENTITY पहचान स्तंभ के साथ ही काम कर रहा है काम नहीं करता है पर इसे अद्यतन की जरूरत है।

यहां मेरा कोड। कोई विचार?

CREATE DATABASE Test; 
GO 
USE Test; 
GO 

-- Create entities 
CREATE TABLE [dbo].[aspnet_Applications](
    [ApplicationName] [nvarchar](256) NOT NULL, 
    [LoweredApplicationName] [nvarchar](256) NOT NULL, 
    [ApplicationId] [uniqueidentifier] NOT NULL, 
    [Description] [nvarchar](256) NULL, 
PRIMARY KEY NONCLUSTERED 
(
    [ApplicationId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], 
UNIQUE NONCLUSTERED 
(
    [LoweredApplicationName] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], 
UNIQUE NONCLUSTERED 
(
    [ApplicationName] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[aspnet_Applications] ADD DEFAULT (newid()) FOR [ApplicationId] 
GO 


CREATE TABLE [dbo].[aspnet_Users](
    [ApplicationId] [uniqueidentifier] NOT NULL, 
    [UserId] [uniqueidentifier] NOT NULL, 
    [UserName] [nvarchar](256) NOT NULL, 
    [LoweredUserName] [nvarchar](256) NOT NULL, 
    [MobileAlias] [nvarchar](16) NULL, 
    [IsAnonymous] [bit] NOT NULL, 
    [LastActivityDate] [datetime] NOT NULL, 
PRIMARY KEY NONCLUSTERED 
(
    [UserId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[aspnet_Users] WITH CHECK ADD FOREIGN KEY([ApplicationId]) 
REFERENCES [dbo].[aspnet_Applications] ([ApplicationId]) 
GO 

ALTER TABLE [dbo].[aspnet_Users] ADD DEFAULT (newid()) FOR [UserId] 
GO 

ALTER TABLE [dbo].[aspnet_Users] ADD DEFAULT (NULL) FOR [MobileAlias] 
GO 

ALTER TABLE [dbo].[aspnet_Users] ADD DEFAULT ((0)) FOR [IsAnonymous] 
GO 

-- Add data 
DECLARE @MyIdentity binary(16); 
INSERT INTO dbo.aspnet_Applications 
(
    ApplicationName, 
    LoweredApplicationName, 
    Description 
) 
VALUES 
(
    'x', 
    'x', 
    'Dummy text' 
); 
SET @MyIdentity = SCOPE_IDENTITY(); -- DOES NOT WORK 
PRINT @MyIdentity; -- DOES NOT WORK 

INSERT INTO dbo.aspnet_Users 
(
    ApplicationId, 
    UserName, 
    LoweredUserName, 
    MobileAlias, 
    IsAnonymous, 
    LastActivityDate 
) 
VALUES 
( 
    @MyIdentity, 
    'Administrator', 
    'administrator', 
    '', 
    0, 
    sysutcdatetime() 
); 
+1

+1 रास्ते में उपयोगी डीडीएल के लिए। –

+0

हालांकि (आईएमओ) आपको अद्वितीय पहचानकर्ताओं की आवश्यकता नहीं है (पहचान कॉलम नौकरी करेगा और आपको बेहतर प्रदर्शन देगा), GUID के साथ भी यदि आप SET @MyIdentity = NewSequentialID() का उपयोग करते हैं तो आप क्लस्टर प्राथमिक कुंजी प्राप्त कर सकते हैं। आप IDS कॉलम के लिए डिफ़ॉल्ट मान के रूप में NewSequentialID() का भी उपयोग कर सकते हैं और मार्टिन द्वारा प्रस्तावित OUTPUT कथन का उपयोग करके डाले गए मान प्राप्त कर सकते हैं। – Niikola

उत्तर

13

यह एक छोटे से अधिक काम करते हैं, लेकिन अपने आवेषण के लिए, भले ही आप पहले ApplicationID पर एक डिफ़ॉल्ट मान है, तो आप ऐसा कर सकता है है:

DECLARE @MyIdentity uniqueidentifier; 
SET @MyIdentity = NewID(); 
INSERT INTO dbo.aspnet_Applications 
(
    ApplicationName, 
    LoweredApplicationName, 
    ApplicationId, 
    Description 
) 
VALUES 
(
    'x', 
    'x', 
    @MyIdentity, 
    'Dummy text' 
); 

SELECT @MyIdentity 

अनिवार्य रूप से, आप GUID पहले से निर्धारित करते हैं, तो आप पहले से ही जानते हैं कि आप क्या डालेंगे।

+0

महान समाधान! – GibboK

4

आप डाला मूल्य (रों) वापस पाने के लिए OUTPUT खंड इस्तेमाल कर सकते हैं लेकिन LBT's answer शायद और अधिक सरल और कुशल है।

DECLARE @ids table(id uniqueidentifier) 

INSERT INTO dbo.aspnet_Applications 
(
    ApplicationName, 
    LoweredApplicationName, 
    Description 
) 
OUTPUT INSERTED.ApplicationId into @ids 
VALUES 
(
    'x', 
    'x', 
    'Dummy text' 
) 

तरह से अगर यह विदेशी कुंजी आप नीचे के रूप में इस के लिए composable DML इस्तेमाल कर सकते हैं के लिए नहीं था के द्वारा।

INSERT 
INTO dbo.aspnet_Users 
     (
       ApplicationId , 
       UserName  , 
       LoweredUserName, 
       MobileAlias , 
       IsAnonymous , 
       LastActivityDate 
     ) 
SELECT ApplicationId , 
     'Administrator', 
     'administrator', 
     ''    , 
     0    , 
     sysutcdatetime() 
FROM (INSERT 
     INTO dbo.aspnet_Applications 
       (
         ApplicationName  , 
         LoweredApplicationName, 
         Description 
       ) 
       OUTPUT INSERTED.ApplicationId VALUES 
       (
         'x', 
         'x', 
         'Dummy text' 
       ) 
     ) AS I 
संबंधित मुद्दे