在传递查询中解析值

时间:2017-09-05 18:12:07

标签: sql-server oracle tsql ssms

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

所以,我离开了这个:

Select *

到此:

Select TRIM(col1), col2

现在,我无法引用传递中的列。似乎Select *允许您通过Oracle中的名称引用列,但是一旦明确列出了列(如col2),我就会收到无效的列名错误。

以下是有问题的简化代码。它表示SOURCE.col1SOURCE.col2的任何引用都是无效的列名。 (如果我在传递中执行Select *,则可以。)

 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
    )
;

1 个答案:

答案 0 :(得分: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
    )
;