2017-09-05 45 views
0

在TSQL中,我使用传递查询从Oracle数据库中选择所有数据。这是一个简单的声明,它工作正常。但是,我意识到我需要在传递查询中添加一些TRIM。解析传递查询中的值

所以,我从这个去:

Select *

这样:

Select TRIM(col1), col2

现在,我不能引用在直通的列。看起来像Select *允许你在Oracle中通过他们的名字来引用列,但是一旦列被明确列出(如col2),我会得到一个无效的列名错误。

这里是有问题的简化代码。它说SOURCE.col1SOURCE.col2的任何引用都是无效的列名称。 (这是确定的,如果我在直通做一个选择*虽然)。

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