문제

다른 데이터베이스에 복제 된 데이터베이스에 게시하는 C# 응용 프로그램이 있으며 (병합 반복 사용) 저장 프로 시저 인 사용자 정의 리졸버가 하나 있습니다.

이것은 SQL Server 2000 하에서 정상적으로 작동했지만 SQL Server 2005에서 테스트 할 때 사용자 정의 Resolver는 빈 Varchar 열을 nulls로 변경하려고 시도합니다 (그리고이 특정 열에 실패하면 널을 허용하지 않습니다).

이러한 바르 차르 필드는 두 데이터베이스에서 현재 비어 있고 변경되지 않았으며 저장된 절차가 변경되지 않기 때문에 충돌을 일으키는 필드가 아닙니다 (수행중인 모든 것은 다른 돈 열의 가치를 설정하려고 시도하는 것입니다). .

누구 든지이 문제를 발견했거나 빈 줄을 그대로 두는 저장된 절차의 예가 있습니까?

실제 저장된 절차는 상당히 간단하고 충돌시 고객 균형을 다시 계산합니다.

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- 삽입 전에 데이터를 변경하여 더 이상 '널'을 포함하지 않도록 '삽입 전'트리거를 추가하십시오.

추신 : 복제 시스템에 해당 열이 "필수"로 표시되어 있다는 것이 긍정적입니까? 필요하지 않은 경우 데이터가 없으면 'NULL'을 삽입 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top