У нас есть приложение C#, которое отправляет в базу данных, которая реплицируется в другую базу данных (с использованием репликации слиянием) и имеет один настраиваемый распознаватель, который является хранимой процедурой.Репликация Пользовательский преобразователь изменяет пустые строки на NULL
Это нормально работало под SQL Server 2000, но при тестировании в SQL Server 2005 пользовательский резольвер пытается изменить любые пустые столбцы varchar на нуль (и с ошибкой, поскольку этот конкретный столбец не разрешает значения 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)
Можете ли вы опубликовать проблему в своей хранимой процедуре? Это не звучит знакомо, хотя, возможно, была проблема с 2000 или 2005 годом, которая была бы подсвечена, если бы мы увидели вашу сохраненную proc. – Erich
Я включил всю хранимую процедуру, поскольку она довольно короткая. Тем не менее, та же ошибка возникает, если я удаляю первые два выбора и заменяю обновление на что-то вроде: - Update Customer Set SystemBalance = 0, где rowguid = @rowguid – sgmoore
Что именно происходит с ошибкой? Это ошибка SQL, или на C# где-то? Какие поля/поля являются «проблемными»? Я не вижу случая, когда это могло бы возвращать nulls через что-либо, кроме как через оператор Select *. Единственный способ, которым я могу понять, что это происходит, - это если запись не существует. Не могли бы вы попытаться назвать столбцы в выборе или сделать, где будет где id = @ customerId? – Erich