2012-09-04 5 views
0

아래는 하위 쿼리를 사용하여 TableString 열을 반환하는 트리거 된 SQL의 일부입니다. 하위 쿼리는 처음 두 값과 Fname에 대한 "마커"를 반환하지만 이후에는 아무 것도 표시하지 않습니다 (세미콜론도 아님). TableString 열은 255 자로 설정되고 삽입 또는 업데이트 중에 모든 유사한 데이터를 캡처하는 nvarchar입니다. TableString에서SQL 하위 쿼리의 ISNULL이 아무 것도 반환하지 않습니다.

INSERT INTO TransactionLog (TransactionDate, Operator, TableName, Action 
          , TableString, UserId) 
SELECT LastChangeDate 
    , 'Op' 
    , @tableName 
    , @action 
    , CAST('sNum:' + CAST(sNumber as nvarchar(10)) + ' entType:' + EntityType 
      + ' Fname:' + ISNULL(FirstName, 'NULL') 
      + ' Lname:' + ISNULL(LastName, 'NULL') 
      + ' suff:' + ISNULL(NameSuffix, 'NULL') 
      + ' corpName:' + ISNULL(CorporateName, 'NULL') 
      + ' ctrlId:' + ISNULL(CAST(ControlId as nvarchar(3)), 'NULL') 
      AS nvarchar(30)) as TableString 
    , LastChangeOperator 
FROM deleted 

반환 값 :

sNum:1000024 entType:S Fname 
+0

정말 TableString을 nvarchar (max) 필드로 지정해야합니다. – TheGeekYouNeed

답변

3

ISNULL와는 아무 상관이없는 것이 아니라, 데이터의 절단의 결과입니다.

에주의가로 :이다

.. AS nvarchar(30) 

, 더 많은 데이터가 생략되고있다. 이 경우 출력에 "Fname :"이 포함되지 않습니다.

+0

좋은 캐치. 그의 반환 값은 28 문자가 이상하게 보입니다. –

+0

@AbeMiessler 그건 내 팁 - 오프 :) –

+0

대단히 감사합니다. 나는 완전히 그것을 놓쳤다. .. – NealR

0

Nvarchar (30)은 30 바이트를 의미하고 유니 코드 (N)는 2 바이트로 표시되므로 반환 문자 수는 28입니다. 유니 코드가 아닌 문자를 저장하는 경우에도 마찬가지입니다. varchar 선언의 숫자는 문자 수, 사용할 바이트 수는 아닙니다. Nvarchar를 사용할 때 실제로 사람을 얻습니다.

관련 문제