Frage

Wir haben eine C # Anwendung, die Beiträge zu einer Datenbank, die in einer anderen Datenbank repliziert wird (Merge-Replikation) und verfügen über eine benutzerdefinierte Resolver, die eine gespeicherte Prozedur ist.

Dies funktioniert gut unter SQL Server 2000, aber wenn sie unter SQL Server 2005 die benutzerdefinierte Resolver Prüfung versucht, alle leeren varchar-Spalten zu ändern nulls zu sein (und andernfalls cos diese bestimmte Spalte läßt Nullwert nicht).

Beachten Sie, dass diese varchar Felder sind nicht diejenigen, die den Konflikt verursachen, da sie aktuelle leer auf beiden Datenbanken sind und werden nicht geändert und die gespeicherte Prozedur, sie ändert sich nicht (alles was man tut, versucht, den Wert eines anderen zu setzen Geld Spalte).

Hat jemand über dieses Problem kommen, oder hat Beispiel einer gespeicherten Prozedur, die leeren Saiten verlassen wird, wie sie sind?

Die tatsächliche gespeicherte Prozedur ist ziemlich einfach und und neu berechnet die Kundenbilanz im Fall eines Konflikts.

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)
War es hilfreich?

Lösung

Sie haben ein paar Optionen hier, jeweils ein bisschen ein Problem zu umgehen, was meine Forschung zu zeigen, scheint ein Problem mit SQL Server ist.

1- Alter dieser Aussage: Select * From Customer Where rowguid= @rowguid explizit jede der Säulen zu erwähnen, und verwenden Sie einen „isNull“ für die säumigen Felder

2 Ändern Sie die Spalte in der Tabelle eine Standardeinschränkung für ‚‘ hinzuzufügen. Was wird dies tut, ist, wenn Sie ein ‚Null‘ einzufügen versuchen, es mit dem leeren String ersetzt

3- hinzufügen ‚vor insert‘ Trigger, der die Daten vor dem Einsatz verändern wird, nicht eine ‚Null‘ enthalten mehr

PS: Sind Sie positiv, dass das Replikationssystem die Spalte als „erforderlich“ markiert hat? Ich denke, wenn es nicht erforderlich ist, wird es einfügen ‚Null‘, wenn keine Daten vorhanden sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top