別のデータベースに (マージ レプリケーションを使用して) レプリケートされ、ストアド プロシージャである 1 つのカスタム リゾルバーを持つデータベースにポストする C# アプリケーションがあります。
これは SQL Server 2000 では正常に機能していましたが、SQL Server 2005 でテストすると、カスタム リゾルバーは空の varchar 列を null に変更しようとします (この特定の列は null を許可しないので失敗します)。
これらの varchar フィールドは、両方のデータベースで現在空であり、変更されておらず、ストアド プロシージャがそれらを変更していないため、競合を引き起こすものではないことに注意してください (別の money 列の値を設定しようとしているだけです)。 .
誰かがこの問題に遭遇したことがありますか、または空の文字列をそのまま残すストアドプロシージャの例がありますか?
実際のストアド プロシージャはかなり単純で、競合が発生した場合に顧客の残高を再計算します。
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)