Получите последнюю строку, вставленную с Uniqueidentifier, что это не ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ

Я озадачен запросом.

Я должен узнать, что ПОСЛЕДНЯЯ строка, добавленная в таблице со столбцом со столбцом Uniqueidentifier типа данных: aspnet_Applications. Примечания ApplicationId: Этот столбец Uniqueidentifier это не и Столбец ИДЕНТИФИКАЦИОННЫХ ДАННЫХ.

Я должен также взять последнюю вставленную строку и обновить ее на другой таблице aspnet_Users. ApplicationId

Я пытался использовать SCOPE_IDENTITY в MS SQL 2008, но не работаю, потому что 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()
);
7
задан Martin Smith 11 August 2010 в 11:46
поделиться

2 ответа

Это немного больше работы, но для ваших вставок, даже если у вас уже есть значение DEFAULT в 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 заранее, поэтому вы уже знаете, что будете вставлять.

14
ответ дан 6 December 2019 в 10:47
поделиться

Вы могли использовать предложение OUTPUT , чтобы вернуть вставленные значения, но ответ LBT , вероятно, более прост. и эффективный.

DECLARE @ids table(id uniqueidentifier) 

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

Кстати, если бы не внешний ключ, вы могли бы использовать для этого составной 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
4
ответ дан 6 December 2019 в 10:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: