2017-09-05 8 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