使用备份表插入数据时timestamp非空列报错求助
解决方法
SQL Server里的timestamp(现在官方推荐用rowversion命名)是系统自动维护的列,专门用来记录行的版本号,完全不需要手动插入值——插入新行时数据库会自动生成唯一的二进制值填充这个列,而且你也没法手动给它赋值(包括NULL也不行)。
针对你的需求,正确的脚本写法分两种场景:
场景1:直接插入源表所有行(不考虑目标表已有数据)
直接在INSERT语句里省略timestamp列,数据库会自动处理:
INSERT INTO [dbo].[ZHG$Sales Order Price Scale_TEMP1] ( [Order No_], [Buy-from Vendor No_], [Delivery Date (Price_Cond_)], [Number of Storage Spaces], [Price Scale Code] ) SELECT [Order No_], [Buy-from Vendor No_], [Delivery Date (Price_Cond_)], [Number of Storage Spaces], [Price Scale Code] FROM [dbo].[ZHG$Sales Order Price Scale_TEMP]
场景2:只插入目标表中缺失的行(核心需求)
需要先判断哪些行在目标表中不存在,再插入。这里用NOT EXISTS来过滤重复行(你可以根据实际业务主键调整判断条件,下面假设Order No_和Price Scale Code是唯一标识行的组合):
INSERT INTO [dbo].[ZHG$Sales Order Price Scale_TEMP1] ( [Order No_], [Buy-from Vendor No_], [Delivery Date (Price_Cond_)], [Number of Storage Spaces], [Price Scale Code] ) SELECT t.[Order No_], t.[Buy-from Vendor No_], t.[Delivery Date (Price_Cond_)], t.[Number of Storage Spaces], t.[Price Scale Code] FROM [dbo].[ZHG$Sales Order Price Scale_TEMP] t WHERE NOT EXISTS ( SELECT 1 FROM [dbo].[ZHG$Sales Order Price Scale_TEMP1] t1 WHERE t1.[Order No_] = t.[Order No_] AND t1.[Price Scale Code] = t.[Price Scale Code] -- 可以根据实际业务需求添加更多唯一判断条件 )
补充说明
如果你非要在INSERT列列表里写timestamp列,也可以用DEFAULT关键字,但其实完全没必要,省略列名更简洁:
INSERT INTO [dbo].[ZHG$Sales Order Price Scale_TEMP1] ( timestamp, [Order No_], [Buy-from Vendor No_], [Delivery Date (Price_Cond_)], [Number of Storage Spaces], [Price Scale Code] ) SELECT DEFAULT, -- 让数据库自动生成timestamp值 [Order No_], [Buy-from Vendor No_], [Delivery Date (Price_Cond_)], [Number of Storage Spaces], [Price Scale Code] FROM [dbo].[ZHG$Sales Order Price Scale_TEMP]
不过这种写法不如直接省略timestamp列来得直观,推荐用第一种方式。
内容的提问来源于stack exchange,提问作者Christoph
相关产品推荐
相关产品推荐

