Sql Server 2012 更改数据捕获奇怪的行为

Mah*_*ari 2 sql-server-2012 change-data-capture

在我的 Sql Server 2012 中,我在数据库中有下表

CREATE TABLE [dbo].[HumanResource](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [IsHired] [bit] NULL,
    [Address] [nvarchar](max) NULL,
    [Score] [bigint] NULL,
    [LastUpdate] [datetime] NULL,
 CONSTRAINT [PK_HumanResource] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

当我更新地址字段(nvarchar,not null)时,它被捕获如下

NULL 3 2 MAHMOOD真 这里 111 2014年9月1日14:42:28.913
NULL 4 2 MAHMOOD真 111 2014年9月1日14:42:28.913

但是当我更新 Score 字段 (nvarchar, null ) 时,它会被捕获

NULL 3 2 Mahmood True NULL 111 2014-09-01 14:42:28.913
NULL 4 2 Mahmood True there 111 2014-09-01 14:42:28.913


**编辑(更新和选择查询):

update HumanResource set Address = 'blah blah blah' where id = 2
update HumanResource set Score = Score + 1 where id = 2

SELECT        TOP (10000) __$start_lsn, __$end_lsn, __$seqval, __$operation,  
__$update_mask, ID, Name, IsHired, Address, Score, LastUpdate
FROM            cdc.dbo_HumanResource_CT
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

考虑到 sql server Update 是一个链式的Delete 和 Insert,第一行是删除行捕获,第二行是插入行捕获。

但是我不明白为什么当我更新其他字段时地址被跟踪为 NULL,我很感激有关此问题的任何信息。

小智 6

这是MSDN

数据的大对象数据类型的列类型imagetext以及ntext总是被分配一个NULL值时__$operation = 1__$operation = 3。数据类型varbinary(max)varchar(max)、 或的列nvarchar(max)被分配一个NULL值,__$operation = 3除非该列在更新期间发生更改。当 时__$operation = 1,这些列在删除时被赋值。包含在捕获实例中的计算列的值始终为NULL

默认情况下,可以添加到拍摄的列在一个单一的最大尺寸INSERTUPDATEWRITETEXT,或UPDATETEXT语句65,536 bytes64 KB。要增加此大小以支持更大的 LOB 数据,请使用配置max text repl size服务器配置选项指定更大的最大大小。有关详细信息,请参阅配置max text repl size服务器配置选项。

您正在使用一个nvarchar(max). 我有同样的问题。我通过更改我的varchar(max)with 来修复它varchar(255)。对于一个地址255应该足够了。

希望这有帮助