【问题标题】:Transfer data from one table to another identical table将数据从一个表传输到另一个相同的表
【发布时间】:2021-12-27 09:54:12
【问题描述】:
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

我想要的是一种动态的方式来从一个表中复制数据,该表与另一个数据库中的另一个表具有相同的设置,但我继续收到此错误:

只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表 'db1.dbo.MsSubProject' 中的标识列指定显式值。

我已经明确地将 IDENTITY_INSERT 设置为 ON。 此外,即使我尝试像这样显式写出表格列:

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

这也行不通……

我做错了什么?我在 StackOverflow 上找到的针对此特定问题的每个解决方案都不适合我。

【问题讨论】:

  • “这也行不通……” 那么当这样做时会发生什么呢?

标签: sql sql-server stored-procedures


【解决方案1】:

您应该养成在SELECT 语句中使用显式列列表的习惯! SELECT * 可以在 SSMS 中查询 ad-hoc 样式 - 但应该禁止在任何生产代码中使用它!

试试这个:

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

【讨论】:

  • 这终于奏效了。非常感谢。尽管这很烦人,但我不能像您所说的那样“临时”插入数据。只是强迫我写更多的代码。
【解决方案2】:

如果你真的不想写列列表,你可以使用动态 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2015-12-16
    相关资源
    最近更新 更多