我们有一个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)
答案 0 :(得分:0)
这里有几个选项,每个选项都有一些解决方法,我的研究似乎表明SQL Server存在问题。
1-更改此声明:Select * From Customer Where rowguid= @rowguid
明确提及每一列,并对违规字段使用“isNull”
2-更改表格中的列,为''添加默认约束。这样做,如果你试图插入'null',它将用空字符串
替换它3-添加一个'before insert'触发器,它将在插入之前改变数据,不再包含'null'
PS:您是否肯定复制系统将该列标记为“必需”?我认为如果不需要,如果没有数据,它将插入'null'。