复制自定义解析程序将空字符串更改为NULL

时间:2009-10-02 12:18:37

标签: sql-server-2005 merge-replication resolver

我们有一个C#应用程序,它发布到一个数据库,该数据库被复制到另一个数据库(使用合并复制),并且有一个自定义解析器,它是一个存储过程。

这在SQL Server 2000下运行正常,但是在SQL Server 2005下进行测试时,自定义解析程序正在尝试将任何空的varchar列更改为空(并且失败,因为此特定列不允许空值)。

请注意,这些varchar字段不是导致冲突的字段,因为它们在两个数据库上当前都是空的并且没有被更改,并且存储过程不会更改它们(它正在尝试设置另一个的值)钱栏)。

有没有人遇到过这个问题,或者有一个存储过程的例子会留下空字符串呢?

实际存储过程相当简单,并在发生冲突时重新计算客户余额。

ALTER procedure [dbo].[ReCalculateCustomerBalance]
    @tableowner sysname,
    @tablename sysname,
    @rowguid varchar(36),
    @subscriber sysname,
    @subscriber_db sysname,
    @log_conflict INT OUTPUT,
    @conflict_message nvarchar(512) OUTPUT
AS
    set nocount on
DECLARE
    @CustomerID  bigint,
    @SysBalance money,
    @CurBalance money,
    @SQL_TEXT nvarchar(2000)

    Select @CustomerID = customer.id from customer where rowguid=  @rowguid

    Select @SysBalance = Sum(SystemTotal), @CurBalance = Sum(CurrencyTotal)  From CustomerTransaction Where CustomerTransaction.CustomerID = @CustomerID

    Update Customer Set SystemBalance = IsNull(@SysBalance, 0), CurrencyBalance = IsNull(@CurBalance, 0) Where id = @CustomerID

    Select * From Customer Where rowguid= @rowguid

    Select @log_conflict =0
    Select @conflict_message ='successful'
    Return(0)

1 个答案:

答案 0 :(得分:0)

这里有几个选项,每个选项都有一些解决方法,我的研究似乎表明SQL Server存在问题。

1-更改此声明:Select * From Customer Where rowguid= @rowguid明确提及每一列,并对违规字段使用“isNull”

2-更改表格中的列,为''添加默认约束。这样做,如果你试图插入'null',它将用空字符串

替换它

3-添加一个'before insert'触发器,它将在插入之前改变数据,不再包含'null'

PS:您是否肯定复制系统将该列标记为“必需”?我认为如果不需要,如果没有数据,它将插入'null'。