우리는 병합 복제를 사용하여 다른 데이터베이스에 복제되고 저장 프로 시저 인 하나의 사용자 지정 해결 프로그램이있는 데이터베이스에 게시하는 C# 응용 프로그램이 있습니다.복제 사용자 지정 확인자가 빈 문자열을 NULL로 변경합니다.
이것은 SQL Server 2000에서 제대로 작동했지만 SQL Server 2005에서 테스트 할 때 사용자 지정 해결 프로그램은 null이되도록 모든 빈 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 중 하나를 선택하면 저장 프로 시저를 보았을 때 강조 할만한 문제가 발생할 수 있습니다. – Erich
저장 프로 시저 전체가 상당히 짧기 때문에 포함 시켰습니다. 그러나 첫 번째 두 선택을 제거하고 업데이트를 다음과 같이 바꿀 경우에도 동일한 오류가 발생합니다. - Update Customer Set SystemBalance = 0 where rowguid = @rowguid – sgmoore
오류는 정확히 무엇입니까? 그것은 SQL 오류 또는 C# 어딘가에 있습니까? 어떤 필드가 '문제'필드입니까? Select * 문을 제외하고는 null을 반환 할 수있는 경우가 전혀 없습니다. 내가 일어날 수있는 유일한 방법은 기록이 존재하지 않는다는 것입니다. select에서 열의 이름을 지정하거나 id = @ customerId 인 위치를 지정해 주시겠습니까? – Erich