2009-10-02 3 views
0

우리는 병합 복제를 사용하여 다른 데이터베이스에 복제되고 저장 프로 시저 인 하나의 사용자 지정 해결 프로그램이있는 데이터베이스에 게시하는 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) 
+0

저장 프로 시저의 문제 부분을 게시 할 수 있습니까? 이것은 익숙하지 않은 것처럼 들리지만 2000 또는 2005 중 하나를 선택하면 저장 프로 시저를 보았을 때 강조 할만한 문제가 발생할 수 있습니다. – Erich

+0

저장 프로 시저 전체가 상당히 짧기 때문에 포함 시켰습니다. 그러나 첫 번째 두 선택을 제거하고 업데이트를 다음과 같이 바꿀 경우에도 동일한 오류가 발생합니다. - Update Customer Set SystemBalance = 0 where rowguid = @rowguid – sgmoore

+0

오류는 정확히 무엇입니까? 그것은 SQL 오류 또는 C# 어딘가에 있습니까? 어떤 필드가 '문제'필드입니까? Select * 문을 제외하고는 null을 반환 할 수있는 경우가 전혀 없습니다. 내가 일어날 수있는 유일한 방법은 기록이 존재하지 않는다는 것입니다. select에서 열의 이름을 지정하거나 id = @ customerId 인 위치를 지정해 주시겠습니까? – Erich

답변

0

몇 가지 옵션이 있습니다. 각 연구에서 SQL Server의 문제점을 보여주는 것으로 보입니다. ''에 대한 기본 제약 조건을 추가 할 테이블의 열을 변경하여 명시 적으로 각 열을 언급 Select * From Customer Where rowguid= @rowguid하고, 잘못된 필드

2에 대한 "isNull에"를 사용 :

1

이 문을 변경합니다. 이 작업을 수행하려면 'null'을 삽입하려고하면 빈 문자열로 바뀝니다.

3 삽입하기 전에 데이터를 변경하는 'before insert'트리거를 추가합니다. 'null'더 이상

추 신 : 복제 시스템에 "필수"로 표시된 열이 있다고 확신합니까? 나는 그것이 필요하지 않으면 데이터가 없다면 'null'을 삽입 할 것이라고 생각한다.

+0

제안 해 주셔서 감사합니다. 그들 모두를 통해 일하는 데는 시간이 걸릴 수 있습니다. 2의 변형을 시도해 보았습니다. 실제로는 문자 a에 기본 제약 조건을 설정했습니다 (적용된 시점을보다 쉽게 ​​볼 수 있도록하기 위해). 이 경우 빈 문자열은 여전히 ​​null로 바뀌 었습니다. 필요한 열의 의미를 이해하지 못했습니다. 그것은 확실히 복제에 포함됩니다. 그것이 당신이 의미하는 것이 아니라면, '필수'상태를 어떻게 확인합니까? – sgmoore

+0

확실치 않지만 SQL 복제를 검색하는 동안 발견했습니다. 분명히 필요한지 여부를 말할 수있는 일종의 설정이 있습니다. – Erich

+0

제안 1은 아무런 효과가 없었습니다. 스토어드 프로 시저가 실행되는 단계에서 아무데도 널 (null)이 없습니다. 아니요 3이 더 유망 해 보입니다. 이것은 Microsoft Sql이지만 ('아는 한') '삽입하기'와 같은 것은 없습니다. 나는 '대신에'(이전에는 사용하지 않았던) 트리거 대신에 더 읽어야 할 것입니다. 그러나 일시적으로 null을 허용하고 after update 트리거를 추가하면 빈 문자열을 되돌릴 수 있습니다. null이 허용되지만 빈 문자열과 다른 의미로 취급하는 열이 있는지 여부에 따라이 작동 여부가 결정됩니다. – sgmoore

관련 문제