2010-08-11 3 views
7

나는 쿼리에 의아해합니다.ID가 아닌 고유 식별자가 삽입 된 마지막 행 검색

나는 데이터 형식 고유 식별자 열이있는 열이있는 테이블에 추가 된 마지막 행을 찾을 수있다 필요 aspnet_Applications.ApplicationId 참고 :이 고유 식별자이 열이 NOT 및 IDENTITY 열입니다.

내가 삽입 된 마지막 행을 타고 aspnet_Users.ApplicationId

내가 MS SQL 2008에서 SCOPE_IDENTITY를 사용하려고하지만, SCOPE_IDENTITY는 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 유용한 DDL의 경우. –

+0

GUID가있는 경우에도 SET @MyIdentity = NewSequentialID()를 사용하면 (ID 열이 작업을 수행하고 성능을 향상시키는) 고유 식별자가 필요하지 않지만 GUID가있는 경우에도 기본 키를 클러스터링 할 수 있습니다. 또한 NewSequentialID()를 ID 열의 기본값으로 사용하고 Martin에서 제안한 OUTPUT 문을 사용하여 삽입 된 값을 가져올 수 있습니다. – Niikola

답변

13

그것은, 그러나 당신의 삽입을 위해, 당신은 이미 애플리케이션 ID에 DEFAULT 값을에도 불구하고,이 조금 더 작업 할 수있어 : 기본적으로

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은 더 간단하고 효율적입니다. 당신이 다음과 같이이를 위해 composable DML을 사용할 수있는 외래 키 아니었다면 그런데

DECLARE @ids table(id uniqueidentifier) 

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

.

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 
관련 문제