【发布时间】:2009-10-02 12:18:36
【问题描述】:
我们有一个 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)
【问题讨论】:
-
你能发布你的存储过程的问题部分吗?这听起来并不熟悉,但如果我们看到您的存储过程,可能会突出显示 2000 或 2005 的问题。
-
我已经包含了整个存储过程,因为它相当短。但是,如果我删除前两个选择并将更新替换为类似的内容,则会发生相同的错误 - Update Customer Set SystemBalance=0 where rowguid= @rowguid
-
抛出的错误究竟是什么?是 SQL 错误,还是在 C# 中的某个地方?什么是“问题”领域?除了通过 Select * 语句之外,我没有看到任何可以通过任何方式返回空值的情况。我能想到的唯一方法是,如果记录不存在。您能否尝试命名选择中的列,或者让您在哪里 id=@customerId?
-
“错误消息”是在存储过程作为复制过程的一部分运行之后出现的,例如,无法将值 NULL 插入“PostCode”列。问题列是任何包含空字符串的 varchar 类型。全部替换为空值。如果我将表定义更改为允许空值,则复制将继续进行而不会出错,但会将数据更改为不正确的空值。记录必须存在(否则不会发生冲突),如果没有冲突(即仅在一侧发生更改),复制也可以正常工作
-
我看不出错误来自哪里。邮政编码?不在此 SP...
标签: sql-server-2005 merge-replication resolver