SQL错误-以..开头的标识符太长-预览在SSMS中有效

问题描述 投票:0回答:1

[当前,当我将Oracle数据库内部的数据加载(选择)到SQL Server Management Studio(SSMS)时遇到问题。

[在SQL Developer(Oracle)中运行以下查询时,它运行良好:

SELECT
        BOT.BOT_ID,
        BOT.BOT_VOLGNUMMER,
        (SELECT
            B.BEW_WAARDE_NUM 
        FROM
            V_BAE_ELEMENT_WAARDEN B 
        WHERE
            B.BOT_ID = BEW.BOT_ID 
            AND B.BET_ID = 740000000000638 
            AND B.BEW_DATUM_INGANG <= TRUNC(B.SYSDATE) 
            AND B.BEW_DATUM_TM >= TRUNC(B.SYSDATE)),
        (SELECT
            BAW.BAW_ANTWOORD 
        FROM
            V_BAE_ELEMENT_WAARDEN B 
        INNER JOIN
            BAE_ANTWOORDEN BAW 
                ON BAW.BAW_ID = B.BAW_ID 
        WHERE
            B.BOT_ID = BEW.BOT_ID 
            AND B.BET_ID = 740000000000671 
            AND 1 = 1 
            AND B.BEW_DATUM_INGANG <= TRUNC(SYSDATE) 
            AND B.BEW_DATUM_TM >= TRUNC(SYSDATE)) 
    FROM
        V_INFO_OBJECT_DUMMY BEW 
    INNER JOIN
        V_INFO_OBJECTEN_ALL BOT 
            ON BEW.BOT_ID = BOT.BOT_ID 
    WHERE
        1 = 1 
        AND (
            BOT.BOE_ID IN (
                1100000039
            ) 
            AND BOT.BOS_STATUS IN (
                'Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5', 'Cat6', 'Cat7'
            )
        ) 
    ORDER BY
        BOT.BOT_VOLGNUMMER ASC

当我在导入向导中(在SSMS中)使用此查询时,它表示SQL语句有效。当我继续并预览数据时(在向导的下一个窗口中),它还为我提供了正确的数据预览(类似于SQL Developer)。但是,当我执行该语句时,它给出了一个错误,即:

Error: Preparation SQL Task 1: The identifier that starts with '(SELECTBEW_WAARDE_NUMFROMV_BAE_ELEMENT_WAARDENBWHEREB.BOT_ID=BEW.BOT_IDANDB.BET_ID=740000000000638ANDB.BEW_DATUM_INGANG<=TRUNC(S' is too long. Maximum length is 128. (SQL Server Import and Export Wizard)

我查询了其他几个类似的问题,但是其中大多数涉及双引号(而不是单引号)的(误用)用法,例如here。或者它们涉及(误)使用方括号而不是括号,例如here

我想这个错误与(最终)列名太长有关?有办法克服吗?还是该错误是由其他原因引起的?

非常感谢您的帮助!

sql sql-server oracle ssms
1个回答
2
投票

您的投影包含标量子查询。可能很好(我相信SQL Server支持它们),但是您没有为它们提供列别名。

现在标识符SELECTBEW_WAARDE_NUMFROMV_BAE_ELEMENT_WAARDENBWHEREB.BOT_ID=BEW.BOT_IDANDB.BET_ID=740000000000638ANDB.BEW_DATUM_INGANG<=TRUNC(S是标量游标的开始,没有空格。因此,我猜测SSMS需要命名列,并且由于您没有提供别名,所以正在使用整个游标语句生成它们。这比允许的128个字符长,因此会出现错误。

(似乎SQL Developer很聪明,可以将substring()应用于生成的名称。)

无论如何,如果我的猜测是正确的,您所要做的就是为这些列提供别名,例如

SELECT
        BOT.BOT_ID,
        BOT.BOT_VOLGNUMMER,
        (SELECT
            B.BEW_WAARDE_NUM 
        FROM
            V_BAE_ELEMENT_WAARDEN B 
        WHERE
            B.BOT_ID = BEW.BOT_ID 
            AND B.BET_ID = 740000000000638 
            AND B.BEW_DATUM_INGANG <= TRUNC(B.SYSDATE) 
            AND B.BEW_DATUM_TM >= TRUNC(B.SYSDATE)
       ) as bew_waarde_num,
       (SELECT
            BAW.BAW_ANTWOORD 
        FROM
            V_BAE_ELEMENT_WAARDEN B 
        INNER JOIN
            BAE_ANTWOORDEN BAW 
                ON BAW.BAW_ID = B.BAW_ID 
        WHERE
            B.BOT_ID = BEW.BOT_ID 
            AND B.BET_ID = 740000000000671 
            AND 1 = 1 
            AND B.BEW_DATUM_INGANG <= TRUNC(SYSDATE) 
            AND B.BEW_DATUM_TM >= TRUNC(SYSDATE)
       ) as baw_antwoord, 
     ....

移植Oracle查询以在SQL Server上运行时可能存在其他问题,例如使用Oracle特定的trunc(SYSDATE)而不是它们的MSSQL类似物CONVERT (date, GETDATE())

© www.soinside.com 2019 - 2024. All rights reserved.