レプリケーションカスタムリゾルバはヌルに空の文字列を変更します
-
19-09-2019 - |
質問
我々は、別のデータベースに複製されたデータベースにポスト(マージレプリケーションを使用)、ストアドプロシージャである1つのカスタムリゾルバを有するC#アプリケーションを有している。
これは、SQL Server 2000で正常に動作しますが、カスタムリゾルバがヌルであることを任意の空のvarchar列を変更しようとしているSQL Server 2005の下にテストする場合(この特定の列がNULL値を許可しないcosを失敗した)。
これらの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)
解決
あなたがここにいくつかのオプションがあり、それぞれの私の研究が示しているようだ何からの回避策のビットは、SQL Serverとの問題ですされます。
1-このステートメントを変更:Select * From Customer Where rowguid= @rowguid
が明示的に各列に言及し、および問題のあるフィールドに「のisNull」を使用
2-「」のデフォルトの制約を追加するテーブルの列を変更します。これが何をするか、あなたは「ヌル」を挿入しようとするならば、それは空の文字列
と置き換えますです3 - は、もはや「ヌル」を含んでいないために、挿入する前にデータを変更します「挿入する前に、」トリガーを追加します。
PS:レプリケーション・システムは、「必須」としてマークされ、その列を持っていることを肯定的か?私はそれが必要ない場合はデータが存在しない場合、それは「NULL」を挿入すると思います。