Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 在插入过程中是否有方法知道和引用标识?_Sql Server 2008 - Fatal编程技术网

Sql server 2008 在插入过程中是否有方法知道和引用标识?

Sql server 2008 在插入过程中是否有方法知道和引用标识?,sql-server-2008,Sql Server 2008,考虑以下几点: CREATE TABLE A ( Id int IDENTITY(1,1) NOT NULL, Id2 int NULL, Name varchar(50) ) CREATE TABLE B ( Id int NULL, Name varchar(50) ) INSERT INTO B (Id, Name) VALUES (100, 'val1'), (200, 'val2'), (NULL, 'val3'), (NULL, 'val

考虑以下几点:

CREATE TABLE A
(
    Id int IDENTITY(1,1) NOT NULL,
    Id2 int NULL,
    Name varchar(50)
)

CREATE TABLE B
(
    Id int NULL,
    Name varchar(50)

)

INSERT INTO B (Id, Name)
VALUES
(100, 'val1'),
(200, 'val2'),
(NULL, 'val3'),
(NULL, 'val4')

INSERT INTO A
    (Id2, Name)
SELECT Id, Name FROM B

UPDATE A SET Id2 = Id + 100000 WHERE Id2 IS NULL

有没有办法避免插入后的更新?也就是说,有没有办法知道标识值是什么并在插入过程中引用它?

您可以通过使用而不是插入触发器来执行类似操作

您还可以使用AFTER INSERT触发器并更新记录,如

create trigger trg_test on A after insert
as begin
    UPDATE a 
    SET id2 = i.Id + 100000 
    FROM A a
    INNER JOIN INSERTED i 
    ON (i.Id = a.Id)
    WHERE a.id2 is null;
end
因此,触发器插入的每条记录都将触发并更新记录。因此,插入查询完成后,结果如下所示

另一种方法没有任何触发器,使用如下临时表

CREATE TABLE #temp1
(
    Id int IDENTITY(1,1) NOT NULL, 
    Id2 int NULL,
    Name varchar(50)

);

insert into #temp1(id2,name)
select id,name from B


UPDATE a 
SET id2 = i.Id + 100000 
FROM A a
INNER JOIN #temp1 i 
ON (i.Id = a.Id)
WHERE a.id2 is null;

可以使用OUTPUT子句查找已添加到表中的标识值:

DECLARE @newkeys TABLE (PrimaryKeyValue int)
INSERT INTO A 
(
Name, Id2
)
OUTPUT INSERTED.IDENTITYCOL INTO @newkeys
SELECT Name, Id FROM B

但是,作为第二步,您仍然需要更新该表-在插入批处理完成之前,标识值不可用。

在一个表上设置一个更新时触发器如何?在这种情况下,不需要单独的更新查询。行将在插入时自动更新。如果必须为每次插入而不是一次更新执行触发器,会对性能产生什么影响?很可能会插入100行。我看不出这是如何工作的,因为它不会将Id添加到常量中。这里有身份证吗?还是我遗漏了什么?谢谢。正如我在上面的评论中所问的,每次插入而不是一次更新都必须执行一个触发器,这会对性能产生什么影响?@Russ,如果您非常关心性能,那么请在我编辑的答案中查看没有任何触发器的替代方法。使用临时表和单个更新操作。那么如何才能在插入时正确设置Id2列呢?恐怕您不能这样做-只有在插入完成后,id才“在运行中”可用。
CREATE TABLE #temp1
(
    Id int IDENTITY(1,1) NOT NULL, 
    Id2 int NULL,
    Name varchar(50)

);

insert into #temp1(id2,name)
select id,name from B


UPDATE a 
SET id2 = i.Id + 100000 
FROM A a
INNER JOIN #temp1 i 
ON (i.Id = a.Id)
WHERE a.id2 is null;
DECLARE @newkeys TABLE (PrimaryKeyValue int)
INSERT INTO A 
(
Name, Id2
)
OUTPUT INSERTED.IDENTITYCOL INTO @newkeys
SELECT Name, Id FROM B