- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用的是 SQL Server 2014。
我通过将所有物理地址列移动到专用地址表来对现有数据库进行非规范化,如下所示:
Customers (CustomerId, AddressLine1, AddressLine2, City, State, Country, etc )
Employees (EmployeeId, AddressLine1, AddressLine2, City, State, Country, etc )
Orders (OrderId, AddressLine1, AddressLine2, City, State, Country, etc )
Addresses (AddressId, Street, City, State, Country, Zip )
Customers (CustomerId, AddressId, etc )
Employees (CustomerId, AddressId, etc )
Orders (CustomerId, AddressId, etc )
从每个表中获取数据到 Addresses 非常简单:
INSERT INTO Addresses (Street, City, State, Country)
SELECT
CONCAT(AddressLine1, AddressLine2), City, State, Country)
FROM Customers
UNION ALL
SELECT
CONCAT(AddressLine1, AddressLine2), City, State, Country)
FROM Employees
UNION ALL
SELECT
CONCAT(AddressLine1, AddressLine2), City, State, Country)
FROM Orders
但是我怎样才能为每个插入的行获取新的 AddressId
值并将其设置为 Customers.AddressId
, Employees.AddressId
,和 Orders.AddressId
值?
...理想情况下,无需使用获取单行、插入行并使用 SCOPE_IDENTITY
进行更新的巨大循环。
最佳答案
假设
1) Adresses、Customers、Employees 和 Orders 具有以下 PK:AdressId、CustomerId、EmployeeId、OrderId
和
2) dbo.Adresses.AdressId 列 (PK) 具有 IDENTITY 属性
然后对于每个源表(客户等),您可以使用以下方法:
/*
-- Just once
CREATE TABLE #AffectedRows (
SourceID INT NOT NULL PRIMARY KEY,
AdressID INT NOT NULL
)
*/
SET XACT_ABORT ON
BEGIN TRAN
TRUNCATE TABLE #AffectedRows
MERGE dbo.Adresses a
USING dbo.Customers c ON a.AdressID = c.AdressID
WHEN NOT MATCHED
THEN
INSERT (City)
VALUES (c.City)
OUTPUT c.CustomerId, inserted.AdressId INTO #AffectedRows;
UPDATE c
SET c.AdressId = ar.AdressId
FROM dbo.Customers c
JOIN #AffectedRows ar ON c.CustomerId = ar.SourceId
--WHERE c.AdressId IS NULL
COMMIT
SELECT * FROM dbo.Customers
关于sql-server - 从一个表复制到另一个表并替换为 SCOPE_IDENTITY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36110379/
以下查询在事务中插入许多记录。我想获取新创建的增量标识符并在下一个 INSERT 中使用它陈述 对于单个记录,我可以使用如下 SELECT @new_emp_id= SCOPE_IDENTITY()
我有 PK,它是自增 key 。我需要将记录插入数据库,然后取回 PK 并在另一个插入中使用它。 但是我想在一笔交易中完成此操作。那可能吗。这个想法是,如果我必须做的任何更新/插入中出现问题,那么我可
好的,我有一个没有自然键的表,只有一个整数标识列作为它的主键。我想插入和检索标识值,但还要使用触发器来确保始终设置某些字段。最初,设计是使用而不是插入触发器,但这破坏了 scope_identity。
抱歉,如果这个问题很愚蠢,但我似乎找不到答案。刚开始使用 SQL。我正在阅读 Get the last inserted row ID (with SQL statement) 的答案,似乎 SCOP
浏览了一些答案,但似乎对我不起作用。 我需要返回一个表的 ID 字段,这样我就可以在程序的不同部分使用它,我试过使用 Convert.ToInt32(sqlComm.ExecuteScalar
我想在插入之前获取新的 id(Identity)。所以,使用这段代码: select SCOPE_IDENTITY() AS NewId from tblName 但是得到这个: 1- 空 2- 空
我有一个相当复杂的对象,包含嵌套的项目列表,每个项目都有自己的表格。 创建此对象时,出于性能原因,我想将它连同它的子对象及其所有后代一起插入到单个事务中。 我的表: Parent |Id| Has a
我创建了一个应该在一个中执行 2 个插入的存储过程 第一步,我想为每个插入创建一个新条目。 第二步我将从这个条目中获取创建的 Id 第三步我想从一个表中复制每个选择的多个条目并将它们插入到具有 Id
我有以下 SQL 代码用于将新记录插入我的数据库 DECLARE @CustomerID INT DECLARE @PropertyID INT BEGIN TRAN T1 INSERT IN
我一直在寻找高低问题的答案,并认为我将转向stackoverflow社区。由于以下错误,我一直在避免在SQL Server和nhibernate中使用类型标识ID字段字段:http://connect
我使用的是 SQL Server 2014。 我通过将所有物理地址列移动到专用地址表来对现有数据库进行非规范化,如下所示: 旧: Customers (CustomerId, AddressLine1
我有一个带有标识列的表,我想在 INSERT 之后获取其值。以下代码不使用参数,但运行良好: string query = "INSERT INTO aTable ([aColumn]) VALUES
当我尝试通过 SQL Server 获取插入数据库的最后一个 ID 时,它返回 __Page。这是我的代码: query = "INSERT INTO seekers(nam
我有一个存储过程,它首先将一些数据插入到临时表中,然后将一行插入到另一个表中。我在第二次插入后调用 Scope_Identity() 以获取新插入的记录 Identity。 如果第二次插入由于连接而没
我有一个表MyTable,我在那个表上有一个After trigger(On Insert)。 当我在 MyTable 上运行批量插入语句时,它会触发触发器以捕获插入的数据(即用于审计日志目的)。 我
我正在用 SQL server 写一个 SP ALTER PROCEDURE [dbo].[spAddUserBadge] AS BEGIN INSERT INTO dbo.SE_UserBa
我的存储过程是: ALTER PROCEDURE [dbo].[Insert_QuickLabDump] @Specimen_ID [varchar](50), @Client_Key
我正在尝试返回新创建行的 ID。我试过用 SCOPE_IDENTITY 来做,但它返回 3。我四处搜索,无法确定我做错了什么。 代码如下: " SelectCommand="SELEC
我遇到异常:“指定的转换无效”,这是代码 con.Open(); string insertQuery = @"Insert into Tender (Name, Name1, Name2) valu
我正在尝试执行一个简单的 INSERT 并返回标识(自动递增主键)。我试过了 cmd.CommandText = "INSERT INTO Prototype ( ParentID ) VALUES
我是一名优秀的程序员,十分优秀!