我的目标是从表中选择项目并将这些项目附加到位于同一服务器上的远程数据库中的另一个表中。两个表中的所有列都匹配且相同。在这种情况下,
我有tsql:
INSERT INTO db1.dbo.tblitems
SELECT *
FROM db2.dbo.tblitems i2
WHERE i2 = 'import'
我收到一个错误说:
只有在使用列列表并且IDENTITY_INSERT为ON时,才能指定表'db1.dbo.tblitems'中标识列的显式值。
为什么这不起作用的任何想法? 提前谢谢
答案 0 :(得分:1)
听起来表中有一个标识列。标识列是由数据库生成的值组成的列。例如:
create table #TestTable (id int identity, name varchar(50))
insert into #TestTable select 1, 'Will Smith'
这会导致identity column
错误。您可以通过两种方式避免这种情况:第一种方法是不插入标识列,例如:
insert into #TestTable (name) select 'Will Smith'
第二种是使用set identity_insert
(需要管理员权限):
set identity_insert #TestTable on
insert into #TestTable (id, name) select 1, 'Will Smith'
set identity_insert #TestTable off
在这两种情况下,您都必须指定列列表。
答案 1 :(得分:0)
我同意Andomar,但需要进一步考虑......
您是否考虑过合并这两个数据集的影响?
假设我在两个数据库中有两个相同的表格,包含这些数据:
Id Name
1 Bill
2 Bob
3 Bert
Id Name
3 Jenny
4 Joan
5 Jackie
Andomar的选项1会给女孩们新的身份证。如果该ID已被用作表中的主键,而其他表将其作为外键引用,那么这将破坏参照完整性(您将记录指向错误的位置)。
如果ID列上有唯一索引,则选项2将会失败,如果将其用作密钥,则很可能。这是因为Bert和Jenny的两个ID值不是唯一的。
因此,虽然Andomar是正确的,它将修复身份插入问题,但它没有解决为什么首先存在标识列的问题。
P.S。如果这是一个问题,请在新问题中寻求解决方案。
答案 2 :(得分:-1)
这可能是权限问题。由于运行查询的服务器无法确定连接的用户是否具有将数据插入目标服务器/表的权限,因此可能无法实现。