SQL Server:如何重用SCOPE_IDENTITY()?

时间:2015-01-05 14:21:03

标签: sql-server

我想在表creneau中对某一行进行某种“复制粘贴”。此行与表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
);

知道我做错了什么?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以忘记使用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
);

答案 2 :(得分:0)

试试这个

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