2017-09-05 1 views
0

TSQL에서 Oracle 데이터베이스의 모든 데이터를 선택하기 위해 통과 쿼리를 사용하고 있습니다. 간단한 진술이고 잘 작동합니다. 그러나 통과 쿼리에 TRIM을 넣어야한다는 것을 알게되었습니다.통과 쿼리의 값 구문 분석

그래서, 나는이에서 갔다 : 이것에

Select *

:

Select TRIM(col1), col2

을 지금, 나는 통과의 열을 참조 할 수 없습니다. Select *와 같이 Oracle에서 열을 참조 할 수 있지만 col2와 같이 열이 명시 적으로 나열되면 잘못된 열 이름 오류가 발생합니다.

다음은 문제의 단순화 된 코드입니다. SOURCE.col1 또는 SOURCE.col2의 참조가 유효하지 않음을 나타냅니다. (그래도 난 통과의 선택 *를 할 경우는 OK입니다.)

MERGE dbo.SqlServerTable AS TARGET 
USING (
    SELECT * FROM OPENQUERY(ORA_REP, ' 
     SELECT 
      TRIM(col1), 
      col2 
     FROM OracleTable 
     ' 
    ) 
) AS SOURCE 
ON (TARGET.Foo = SOURCE.col1) 
WHEN MATCHED THEN 
    UPDATE SET 
     TARGET.Bar = SOURCE.col2 
WHEN NOT MATCHED THEN 
    INSERT (
     Foo, 
     Bar 
    ) 
    VALUES (
     SOURCE.col1, 
     SOURCE.col2 
    ) 
; 
+4

트리밍 된 값에 대한 별칭 추가 ? – HABO

+0

통과 내? – user7733611

+0

지원되는 경우 해당 작업을 수행 할 수있는 곳입니다. – HABO

답변

0

당신은 같은 이름으로 트리밍 된 열 별칭을 할 수 있어야한다 :

MERGE dbo.SqlServerTable AS TARGET 
USING (
    SELECT * FROM OPENQUERY(ORA_REP, ' 
     SELECT 
      TRIM(col1) col1, 
      TRIM(col2) col2 
     FROM OracleTable 
     ' 
    ) 
) AS SOURCE 
ON (TARGET.Foo = SOURCE.col1) 
WHEN MATCHED THEN 
    UPDATE SET 
     TARGET.Bar = SOURCE.col2 
WHEN NOT MATCHED THEN 
    INSERT (
     Foo, 
     Bar 
    ) 
    VALUES (
     SOURCE.col1, 
     SOURCE.col2 
    ) 
; 
+2

'col1 = TRIM (col1)'은 유효하지 않은 (표준) SQL이며 Oracle에서는 작동하지 않습니다. –

+0

그래, 그것을 밖으로 시도하고 작동하지 않았다. – user7733611

+2

@russ : TRIM (col1) col1, TRIM (col2) col2 – EoinS