[当前,当我将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 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())