我们有C#应用其职位,以一个数据库,该数据库复制到另一个数据库(使用合并的复制)和拥有一个定制的解决程序,这是一个存储的过程。

这是工作现在SQL Server2000年,但是当测试下SQL服务器2005年的定义解决程序正在尝试改变的任何空varchar列null(和失败,因为这种特殊列不允许null).

注意,这些varchar fields不是那些引起冲突,因为他们是当前空在两个数据库,并不是正在改变和存储的过程不会改变他们的(它所做的是试图设置的价值的另一个钱列)。

有没有人碰到这个问题,或具有例子的一个存储的过程,这将留下的空串,因为他们是什么?

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

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)
有帮助吗?

解决方案

你有几种选择在这里,每一位的解决方法从我的研究似乎表明一个问题SQL服务器。

1-改变这种声明: Select * From Customer Where rowguid= @rowguid 向明确提到的每个列,使用"函数",为犯罪的领域

2-修改的列表中添加一个默认的约束"。这是什么将这样做,是如果你试图插入一个'null',它将代替其与空字符串

3添加一个'前插入'触发这将改变该数据之前插入,不包含一个'null'了

PS:你是积极的,复制系统已列标记为"需要"?我想如果不是必需的,这将插入'null'如果没有数据存在。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top