t-sql 2012更新主表中的外键值

时间:2015-10-02 20:42:25

标签: sql-server tsql sql-server-2008-r2 sql-server-2012

在特殊请求运行中,我需要更新sql server 2012数据库中的LockerLock表,我有以下2个表定义:

CREATE TABLE [dbo].[Locker](
[lockerID] [int] IDENTITY(1,1) NOT NULL,
[schoolID] [int] NOT NULL,
[number] [varchar](10) NOT NULL,    
[lockID] [int] NULL 
 CONSTRAINT [PK_Locker] PRIMARY KEY NONCLUSTERED 
(
[lockerID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = 
 OFF,      ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 97)
 ON    [PRIMARY]
 ) ON [PRIMARY]

 CREATE TABLE [dbo].[Lock](
[lockID] [int] IDENTITY(1,1) NOT NULL,
[schoolID] [int] NOT NULL,
[comboSeq] [tinyint] NOT NULL
 CONSTRAINT [PK_Lock] PRIMARY KEY NONCLUSTERED 
(
[lockID] ASC
)

Locker表是主表,Lock表是辅助表。我需要添加500个新的Locker个号码,用户已将这些号码放在Locker表格中,并由LockerID唯一定义。我还需要在相应的Lock表中添加500个新行,该表在Lock表中唯一定义并由lockid标识。

由于lockidlock表中的键值,并且在locker表中唯一定义,因此我想知道如何更新lock表500新行。然后,我想取lockid的值(从lock表中获取已创建的500个新行),并将这500个lockids唯一地唯一放入为该行创建的500行中。 lock表。

到目前为止,我的sql看起来如下:

 declare @SchoolID int = 999

 insert into test.dbo.Locker ( [schoolID], [number]) 
    select distinct LKR.schoolID, A.lockerNumber 
    FROM [InputTable] A
    JOIN test.dbo.School SCH 
      ON A.schoolnumber = SCH.type 
     and A.schoolnumber =     @SchoolNumber
    JOIN test.dbo.Locker LKR 
      ON SCH.schoolID = LKR.schoolID 
     AND A.lockerNumber not in (select number 
                                from dbo.Locker 
                                where schoolID = @SchoolID)
    order by LKR.schoolID,  A.lockerNumber 

我不确定如何完成将lockerid唯一地放入locklocker表的其余任务?因此,你可以修改我刚才列出的和/或 想出一些新的SQL,它会告诉我如何实现我的目标?

1 个答案:

答案 0 :(得分:0)

您应该使用OUTPUT声明。首先,您应该将行添加到锁定表然后添加克数锁定并准备插入到锁定表。这符合你的期望:

DECLARE @tmp TABLE (lockid INT)

INSERT dbo.Lock
        ( schoolID, comboSeq )
    OUTPUT Inserted.lockID INTO @tmp ( lockid )
(SELECT
    999,
    1
FROM    master..spt_values sv WHERE sv.type = 'P' AND sv.number <= 500);

INSERT INTO dbo.Locker( schoolID, number, lockID )

SELECT x.schoolID, x.lockerNumber, y.lockid
FROM
(
    SELECT TOP 100 PERCENT DISCTINCT LKR.schoolID, A.lockerNumber, ROW_NUMBER() OVER (ORDER BY A.LockerNumber) rn
    FROM [InputTable] A
    JOIN test.dbo.School SCH ON A.schoolnumber = SCH.type 
    and A.schoolnumber = @SchoolNumber
    JOIN test.dbo.Locker LKR ON SCH.schoolID = LKR.schoolID 
    AND A.lockerNumber not in (select number from dbo.Locker 
    WHERE   schoolID = @SchoolID)
    ORDER by LKR.schoolID,  A.lockerNumber ) x
    JOIN (SELECT t.lockid, ROW_NUMBER() OVER (ORDER BY t.lockid) AS rn FROM @tmp t
) y 
    ON x.rn = y.rn