区分大小写的链接服务器合并脚本 - 设置 IDENTITY_INSERT <table> ON 不工作
Case-Sensitive Linked-Server merge script - Set IDENTITY_INSERT <table> ON not working
我正在做一个实验脚本来进行 SQL 比较(COLLATED
区分大小写)并且我遇到了 SET IDENTITY_INSERT <Table> ON
的问题
我已经打开了这个选项并禁用了外键检查,但它似乎仍然在抱怨后者。
以下是我遵循的步骤:
1 - 我创建了一个链接服务器
EXEC sp_addlinkedserver @Server=N'xxx.xxx.xxx.xxx', @srvproduct=N'SQL Server'
2 - 我添加了登录凭据
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname = N'xxx.xxx.xxxx.xxx',
@locallogin = NULL ,
@useself = N'False',
@rmtuser = N'xxxxxxxxxxx',
@rmtpassword = N'xxxxxxxxxxx'
3 - 在同一批次中,我设置了 identity_insert
、禁用外键检查和 运行 以下合并脚本。请注意,延迟查询 returns 一个 XML
字段在分布式服务器上是不允许的,所以我转换为 NVARCHAR(MAX)
SET IDENTITY_INSERT [DATABASE1].[dbo].[TABLE1] ON
ALTER TABLE [DATABASE1].[dbo].[TABLE1] NOCHECK CONSTRAINT ALL
MERGE [DATABASE1].[dbo].[TABLE1]
USING OPENQUERY([xxx.xxx.xxx.xxx], 'SELECT S.ID, S.EventId, S.SnapshotTypeID, CAST(S.Content AS NVARCHAR(MAX)) AS Content FROM [DATABASE1].[dbo].[TABLE1] AS S') AS S
ON (CAST([DATABASE1].[dbo].[TABLE1].Content AS NVARCHAR(MAX)) = S.Content)
WHEN NOT MATCHED BY TARGET
THEN INSERT VALUES (S.ID, S.EventId, S.SnapshotTypeID, CAST(S.Content AS XML))
WHEN MATCHED
THEN UPDATE SET [DATABASE1].[dbo].[TABLE1].EventId = S.EventId,
[DATABASE1].[dbo].[TABLE1].SnapshotTypeID = S.SnapshotTypeID,
[DATABASE1].[dbo].[TABLE1].Content = S.Content
COLLATE Latin1_General_CS_AS;
GO
我收到的错误消息如下:
Msg 8101, Level 16, State 1, Line 4
An explicit value for the identity column in table 'Database1.dbo.Table' can only be specified when a column list is used and IDENTITY_INSERT is ON.
我该如何解决这个问题?正如我所提到的,这个脚本只是我正在编写的系统之一的实验。我可能在某个地方重新发明了轮子,但这一切都是为了在这个练习中学习。
table 'Database1.dbo.Table' 中标识列的显式值只能在使用列列表且 IDENTITY_INSERT 为 ON 时指定。
您没有列列表
我正在做一个实验脚本来进行 SQL 比较(COLLATED
区分大小写)并且我遇到了 SET IDENTITY_INSERT <Table> ON
我已经打开了这个选项并禁用了外键检查,但它似乎仍然在抱怨后者。
以下是我遵循的步骤:
1 - 我创建了一个链接服务器
EXEC sp_addlinkedserver @Server=N'xxx.xxx.xxx.xxx', @srvproduct=N'SQL Server'
2 - 我添加了登录凭据
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname = N'xxx.xxx.xxxx.xxx',
@locallogin = NULL ,
@useself = N'False',
@rmtuser = N'xxxxxxxxxxx',
@rmtpassword = N'xxxxxxxxxxx'
3 - 在同一批次中,我设置了 identity_insert
、禁用外键检查和 运行 以下合并脚本。请注意,延迟查询 returns 一个 XML
字段在分布式服务器上是不允许的,所以我转换为 NVARCHAR(MAX)
SET IDENTITY_INSERT [DATABASE1].[dbo].[TABLE1] ON
ALTER TABLE [DATABASE1].[dbo].[TABLE1] NOCHECK CONSTRAINT ALL
MERGE [DATABASE1].[dbo].[TABLE1]
USING OPENQUERY([xxx.xxx.xxx.xxx], 'SELECT S.ID, S.EventId, S.SnapshotTypeID, CAST(S.Content AS NVARCHAR(MAX)) AS Content FROM [DATABASE1].[dbo].[TABLE1] AS S') AS S
ON (CAST([DATABASE1].[dbo].[TABLE1].Content AS NVARCHAR(MAX)) = S.Content)
WHEN NOT MATCHED BY TARGET
THEN INSERT VALUES (S.ID, S.EventId, S.SnapshotTypeID, CAST(S.Content AS XML))
WHEN MATCHED
THEN UPDATE SET [DATABASE1].[dbo].[TABLE1].EventId = S.EventId,
[DATABASE1].[dbo].[TABLE1].SnapshotTypeID = S.SnapshotTypeID,
[DATABASE1].[dbo].[TABLE1].Content = S.Content
COLLATE Latin1_General_CS_AS;
GO
我收到的错误消息如下:
Msg 8101, Level 16, State 1, Line 4
An explicit value for the identity column in table 'Database1.dbo.Table' can only be specified when a column list is used and IDENTITY_INSERT is ON.
我该如何解决这个问题?正如我所提到的,这个脚本只是我正在编写的系统之一的实验。我可能在某个地方重新发明了轮子,但这一切都是为了在这个练习中学习。
table 'Database1.dbo.Table' 中标识列的显式值只能在使用列列表且 IDENTITY_INSERT 为 ON 时指定。
您没有列列表