Sql server TableDiff突然从dateTime字段生成空字符串

Sql server TableDiff突然从dateTime字段生成空字符串,sql-server,sql-server-2008,sql-server-2005,batch-processing,Sql Server,Sql Server 2008,Sql Server 2005,Batch Processing,正如超级有用的@Mike D所指出的,这很可能与源数据库SQL 2008r2和目标数据库SQL 2005之间的数据库排序规则差异有关 虽然它可能是相关的,但我认为这个问题值得发表自己的文章。问题在于,当运行此表差异时,它会生成一条insert语句,该语句给出“从字符串转换日期时间时转换失败”,因为insert语句出于某种原因如下所示: VALUES (N'Null',0,N'A',N'Null',N'Null',0,N'Null',Null, N'Null'值是问题所在。从SQL200

正如超级有用的@Mike D所指出的,这很可能与源数据库SQL 2008r2和目标数据库SQL 2005之间的数据库排序规则差异有关

虽然它可能是相关的,但我认为这个问题值得发表自己的文章。问题在于,当运行此表差异时,它会生成一条insert语句,该语句给出“从字符串转换日期时间时转换失败”,因为insert语句出于某种原因如下所示:

VALUES (N'Null',0,N'A',N'Null',N'Null',0,N'Null',Null,    
N'Null'值是问题所在。从SQL2005转到SQL2005时,通常不会发生这种情况。它只有在从SQL 2008r2更改为SQL 2005时才开始发生。有没有办法让tableDiff停止做这个N'Null'并开始做这个Null?如果删除单引号,查询将运行


注意-源中这些有问题字段的数据类型是dateTime,目标中的数据类型也是dateTime。因此,我的理解是,这种情况不应该发生。

N'Null'和Null之间存在巨大差异。N'Null'被认为是一个字符串,而Null表示没有任何内容或没有定义。因此,如果您在datetime字段中插入N'Null',那么它将抛出异常,因为它将尝试将此字符串转换为datetime,并且这样做将始终失败,而如果为Null,它将不会在该列中保存任何内容。如果您必须将该列保留为空,即您现在不想传递任何值,那么您必须插入NULL。

很抱歉,可能我没有正确解释此问题。我意识到其中的差别。TableDiff通过比较两个相同的表来创建查询。source table.field值是一个真正的NULL,但它生成一个包含N'NULL'的查询。这是我的问题。这可能是我在第一篇文章的链接中解释的排序规则差异吗?任何想法都将是错误的,格雷蒂现在已经100%排除了任何相关的排序问题。TableDiff在运行2个相同的2008R2 SQL Server DB时会产生相同的问题。我该如何解决这个问题。TableDiff正在将一个真正的NULL从dateTime字段转换为INSERT语句中的N'NULL',我可以防止这种情况吗?解决方案是应用SQLServer 2008R2 SP 2。这是一个已知的bug,只发生在2008R2中,不仅有dateTime数据类型,还有其他数据类型。我不确定论坛关于接受自己的解决方案的政策??更多关于已知错误的信息请点击此处,以便鼓励您发布并接受自己的答案-请参阅。