Пользовательский преобразователь репликации заменяет пустые строки на NULL - PullRequest
0 голосов
/ 02 октября 2009

У нас есть приложение 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)

1 Ответ

0 голосов
/ 05 октября 2009

У вас есть несколько вариантов здесь, каждый из которых является своего рода обходным решением, которое, как кажется из моего исследования, является проблемой с SQL Server.

1- Измените это утверждение: Select * From Customer Where rowguid= @rowguid, чтобы явно упомянуть каждый из столбцов и использовать «isNull» для полей, нарушающих работу

2- Измените столбец в таблице, чтобы добавить ограничение по умолчанию для ''. Что это будет делать, если вы попытаетесь вставить «ноль», он заменит его пустой строкой

3- Добавить триггер «до вставки», который изменит данные перед вставкой, чтобы больше не содержать «ноль»

PS: Вы уверены, что в системе репликации этот столбец помечен как «обязательный»? Я думаю, что если это не требуется, он вставит 'NULL', если нет данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...