将数据从一个 table 传输到另一个相同的 table
Transfer data from one table to another identical table
SET IDENTITY_INSERT [db1].[dbo].Subscriber ON
INSERT INTO [db1].[dbo].Subscriber
SELECT * FROM [db2].[dbo].SubScriber
PRINT 'Successfully Re-imported data from SubScriber backup'
SET IDENTITY_INSERT [db1].[dbo].Subscriber OFF
我想要的只是一种从一个 table 复制数据的动态方法,该 table 与另一个数据库中的另一个 table 具有相同的设置,但我仍然收到此错误:
An explicit value for the identity column in table 'db1.dbo.MsSubProject' can only be specified when a column list is used and IDENTITY_INSERT is ON.
我已经明确地将 IDENTITY_INSERT 设置为 ON。
另外,即使我尝试像这样显式写出 table 列:
SET IDENTITY_INSERT [db1].[dbo].Subscriber ON
INSERT INTO [db1].[dbo].Subscriber (SubscriberGUID, ItemGUID_Entity, SubscriberID, SubscriberRegionID, SubscriberTypeID, ID, SubscriberNameFull, SubscriberEmail, SubscriberLogin, SubscriberPassword, Active, DateCreated, DateDeleted)
SELECT * FROM [db2].[dbo].SubScriber
PRINT 'Successfully Re-imported data from SubScriber backup'
SET IDENTITY_INSERT [db1].[dbo].MsSubscriber OFF
这也行不通...
我做错了什么?我在 Whosebug 上找到的针对此特定问题的每个解决方案都不适合我。
您应该也养成在SELECT
语句中使用显式列列表 的习惯! SELECT *
可以在 SSMS 中查询临时样式 - 但它应该 禁止 在任何生产代码中使用!
试试这个:
SET IDENTITY_INSERT [db1].[dbo].Subscriber ON
INSERT INTO [db1].[dbo].Subscriber (SubscriberGUID, ItemGUID_Entity, SubscriberID, SubscriberRegionID, SubscriberTypeID, ID, SubscriberNameFull, SubscriberEmail, SubscriberLogin, SubscriberPassword, Active, DateCreated, DateDeleted)
SELECT
SubscriberGUID, ItemGUID_Entity, SubscriberID, SubscriberRegionID,
SubscriberTypeID, ID, SubscriberNameFull, SubscriberEmail,
SubscriberLogin, SubscriberPassword, Active, DateCreated, DateDeleted
FROM [db2].[dbo].SubScriber
PRINT 'Successfully Re-imported data from SubScriber backup'
SET IDENTITY_INSERT [db1].[dbo].MsSubscriber OFF
如果您真的不想写列列表,您可以使用动态SQL
DECLARE @cols1 nvarchar(max), @cols2 nvarchar(max);
SELECT
@cols1 = STRING_AGG(QUOTENAME(c1.name, ',')) WITHIN GROUP (ORDER BY c1.name),
@cols2 = STRING_AGG(QUOTENAME(c2.name, ',')) WITHIN GROUP (ORDER BY c1.name) -- same order
FROM db1.sys.columns c1
JOIN db2.sys.columns c2
WHERE c1.object_id = OBJECT_ID(N'[db1].[dbo].Subscriber')
AND c2.object_id = OBJECT_ID(N'[db2].[dbo].Subscriber');
DECLARE @sql nvarchar(max) = N'
SET IDENTITY_INSERT [db1].[dbo].Subscriber ON;
INSERT INTO [db1].[dbo].Subscriber
(' + @cols1 + N')
SELECT
' + @cols2 + N'
FROM [db2].[dbo].SubScriber;
PRINT ''Successfully Re-imported data from SubScriber backup'';
SET IDENTITY_INSERT [db1].[dbo].Subscriber OFF;
';
EXEC sp_executesql @sql;
SET IDENTITY_INSERT [db1].[dbo].Subscriber ON
INSERT INTO [db1].[dbo].Subscriber
SELECT * FROM [db2].[dbo].SubScriber
PRINT 'Successfully Re-imported data from SubScriber backup'
SET IDENTITY_INSERT [db1].[dbo].Subscriber OFF
我想要的只是一种从一个 table 复制数据的动态方法,该 table 与另一个数据库中的另一个 table 具有相同的设置,但我仍然收到此错误:
An explicit value for the identity column in table 'db1.dbo.MsSubProject' can only be specified when a column list is used and IDENTITY_INSERT is ON.
我已经明确地将 IDENTITY_INSERT 设置为 ON。 另外,即使我尝试像这样显式写出 table 列:
SET IDENTITY_INSERT [db1].[dbo].Subscriber ON
INSERT INTO [db1].[dbo].Subscriber (SubscriberGUID, ItemGUID_Entity, SubscriberID, SubscriberRegionID, SubscriberTypeID, ID, SubscriberNameFull, SubscriberEmail, SubscriberLogin, SubscriberPassword, Active, DateCreated, DateDeleted)
SELECT * FROM [db2].[dbo].SubScriber
PRINT 'Successfully Re-imported data from SubScriber backup'
SET IDENTITY_INSERT [db1].[dbo].MsSubscriber OFF
这也行不通...
我做错了什么?我在 Whosebug 上找到的针对此特定问题的每个解决方案都不适合我。
您应该也养成在SELECT
语句中使用显式列列表 的习惯! SELECT *
可以在 SSMS 中查询临时样式 - 但它应该 禁止 在任何生产代码中使用!
试试这个:
SET IDENTITY_INSERT [db1].[dbo].Subscriber ON
INSERT INTO [db1].[dbo].Subscriber (SubscriberGUID, ItemGUID_Entity, SubscriberID, SubscriberRegionID, SubscriberTypeID, ID, SubscriberNameFull, SubscriberEmail, SubscriberLogin, SubscriberPassword, Active, DateCreated, DateDeleted)
SELECT
SubscriberGUID, ItemGUID_Entity, SubscriberID, SubscriberRegionID,
SubscriberTypeID, ID, SubscriberNameFull, SubscriberEmail,
SubscriberLogin, SubscriberPassword, Active, DateCreated, DateDeleted
FROM [db2].[dbo].SubScriber
PRINT 'Successfully Re-imported data from SubScriber backup'
SET IDENTITY_INSERT [db1].[dbo].MsSubscriber OFF
如果您真的不想写列列表,您可以使用动态SQL
DECLARE @cols1 nvarchar(max), @cols2 nvarchar(max);
SELECT
@cols1 = STRING_AGG(QUOTENAME(c1.name, ',')) WITHIN GROUP (ORDER BY c1.name),
@cols2 = STRING_AGG(QUOTENAME(c2.name, ',')) WITHIN GROUP (ORDER BY c1.name) -- same order
FROM db1.sys.columns c1
JOIN db2.sys.columns c2
WHERE c1.object_id = OBJECT_ID(N'[db1].[dbo].Subscriber')
AND c2.object_id = OBJECT_ID(N'[db2].[dbo].Subscriber');
DECLARE @sql nvarchar(max) = N'
SET IDENTITY_INSERT [db1].[dbo].Subscriber ON;
INSERT INTO [db1].[dbo].Subscriber
(' + @cols1 + N')
SELECT
' + @cols2 + N'
FROM [db2].[dbo].SubScriber;
PRINT ''Successfully Re-imported data from SubScriber backup'';
SET IDENTITY_INSERT [db1].[dbo].Subscriber OFF;
';
EXEC sp_executesql @sql;