Domanda

Abbiamo un'applicazione C# che pubblica su un database che viene replicato su un altro database (utilizzando la replica di unione) e dispone di un risolutore personalizzato che è una procedura memorizzata.

Funzionava bene con SQL Server 2000, ma durante il test con SQL Server 2005 il risolutore personalizzato tenta di modificare qualsiasi colonna varchar vuota in null (e fallisce perché questa particolare colonna non consente valori null).

Tieni presente che questi campi varchar non sono quelli che causano il conflitto poiché sono attualmente vuoti su entrambi i database e non vengono modificati e la procedura memorizzata non li modifica (sta solo tentando di impostare il valore di un'altra colonna di denaro) .

Qualcuno ha riscontrato questo problema o ha un esempio di una procedura memorizzata che lascerà le stringhe vuote così come sono?

La procedura memorizzata effettiva è abbastanza semplice e ricalcola il saldo del cliente in caso di conflitto.

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)
È stato utile?

Soluzione

Hai alcune opzioni qui, ognuna è una soluzione alternativa rispetto a ciò che la mia ricerca sembra mostrare sia un problema con SQL Server.

1- Modifica questa affermazione: Select * From Customer Where rowguid= @rowguid per menzionare esplicitamente ciascuna colonna e utilizzare "isNull" per i campi offensivi

2- Modifica la colonna nella tabella per aggiungere un vincolo predefinito per ''.Ciò che farà è che se tenti di inserire un "null", lo sostituirà con la stringa vuota

3- Aggiungi un trigger "prima dell'inserimento" che modificherà i dati prima dell'inserimento, per non contenere più un "null"

PS:Sei sicuro che il sistema di replica abbia quella colonna contrassegnata come "richiesta"?Penso che se non è richiesto, inserirà "null" se non esistono dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top