Репликация Пользовательский преобразователь изменяет пустые строки на NULL

StackOverflow https://stackoverflow.com/questions/1509193

Вопрос

У нас есть приложение C#, которое отправляет сообщения в базу данных, которая реплицируется в другую базу данных (с использованием репликации слиянием), и имеет один собственный преобразователь, который является хранимой процедурой.

Это работало нормально в SQL Server 2000, но при тестировании в SQL Server 2005 пользовательский преобразователь пытается изменить любые пустые столбцы varchar на значения NULL (и терпит неудачу, поскольку этот конкретный столбец не допускает значений NULL).

Обратите внимание, что эти поля 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. Добавьте триггер «перед вставкой», который изменит данные перед вставкой, чтобы они больше не содержали «ноль».

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top