SQL服务器:如何重新使用SCOPE_IDENTITY()?

SQL Server: how to re-use SCOPE_IDENTITY()?

我想对 table creneau 中的一行做一些 "copy-paste"。此行与 table creneau_jour 具有一对多关系。因此,我也想复制这种关系的所有行。我正在尝试做我用 MySQL 所做的事情,但我遗漏了一些东西,但不知道为什么:

INSERT INTO [RdV].[dbo].[creneau]
           ([libelle]
           ,[debut]
           ,[fin]
           ,[heure_debut]
           ,[duree])
     SELECT
        'Encore !!!', debut, fin, heure_debut, duree 
     FROM 
        creneau 
     WHERE 
        id = 1;

INSERT INTO  [RdV].[dbo].[creneau_jour]
           ([creneau_id] ,[jour_semaine])
VALUES (
    SELECT SCOPE_IDENTITY(), SELECT jour_semaine FROM creneau_jour WHERE id=1
);

知道我做错了什么吗?

试试这个

DECLARE @SCOPEIDENTITY INT;
INSERT INTO [RdV].[dbo].[creneau]
           ([libelle]
           ,[debut]
           ,[fin]
           ,[heure_debut]
           ,[duree])
     SELECT 'Encore v3',debut,fin,heure_debut,duree FROM creneau WHERE id=1;

SET @SCOPEIDENTITY = SCOPE_IDENTITY();
INSERT INTO  [RdV].[dbo].[creneau_jour] ([creneau_id] ,[jour_semaine])
SELECT @SCOPEIDENTITY, jour_semaine FROM creneau_jour WHERE creneau_id=1;

GO
DECLARE @SCOPEIDENTITY INT;
INSERT INTO [RdV].[dbo].[creneau]
           ([libelle]
           ,[debut]
           ,[fin]
           ,[heure_debut]
           ,[duree])
     SELECT 'Encore v3',debut,fin,heure_debut,duree FROM creneau WHERE id=1;

SET @SCOPEIDENTITY = SCOPE_IDENTITY();
INSERT INTO  [RdV].[dbo].[creneau_jour] ([creneau_id] ,[jour_semaine])
SELECT @SCOPEIDENTITY, jour_semaine FROM creneau_jour WHERE creneau_id=1
;

GO

您可以忘记使用 SCOPE_IDENTITY() 并使用 OUTPUT 作为 INSERT 的一部分,这样您就可以使用新创建的行中的值设置变量。

此方法的一个优点是,如果您打开身份插入,则 @SCOPE_IDENTITY 将不起作用,但使用 OUTPUT 的方法会起作用。

DECLARE @Identity INT

INSERT INTO [RdV].[dbo].[creneau]
           ([libelle]
           ,[debut]
           ,[fin]
           ,[heure_debut]
           ,[duree])
OUTPUT inserted.IdentityColumn INTO @Identity
     SELECT
        'Encore !!!', debut, fin, heure_debut, duree 
     FROM 
        creneau 
     WHERE 
        id = 1

INSERT INTO  [RdV].[dbo].[creneau_jour]
           ([creneau_id] ,[jour_semaine])
VALUES (
    SELECT @Identity, SELECT jour_semaine FROM creneau_jour WHERE id=1
);