SQL 错误 - 以 .. 开头的标识符太长 - 可以在 SSMS 中预览
SQL Error - Identifier that starts with .. is too long - preview works in SSMS
目前,我在将驻留在 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 语句有效。当我继续并预览数据时(在向导的下一个 window 中),它也为我提供了正确的数据预览(类似于 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. Or they involve (mis)use of square brackets instead of parentheses, such as here。
我猜这个错误与(最终)列名太长有关?有没有办法克服这个问题?还是其他原因导致的错误?
非常感谢您的帮助!
您的投影包含标量子查询。这可能很好(我相信 SQL 服务器支持它们)但是你没有给它们列别名。
现在标识符 SELECTBEW_WAARDE_NUMFROMV_BAE_ELEMENT_WAARDENBWHEREB.BOT_ID=BEW.BOT_IDANDB.BET_ID=740000000000638ANDB.BEW_DATUM_INGANG<=TRUNC(S
是没有空格的标量游标的开始。所以我猜 SSMS 需要命名列,并且由于您没有提供别名,因此使用 整个游标语句 生成它们。这比允许的 128 个字符长,因此出现错误。
(看来 SQL 开发人员足够聪明,可以将 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 服务器上的 运行 可能存在其他问题,例如使用特定于 Oracle 的 trunc(SYSDATE)
而不是其 MSSQL 类似物CONVERT (date, GETDATE())
目前,我在将驻留在 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 语句有效。当我继续并预览数据时(在向导的下一个 window 中),它也为我提供了正确的数据预览(类似于 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. Or they involve (mis)use of square brackets instead of parentheses, such as here。
我猜这个错误与(最终)列名太长有关?有没有办法克服这个问题?还是其他原因导致的错误?
非常感谢您的帮助!
您的投影包含标量子查询。这可能很好(我相信 SQL 服务器支持它们)但是你没有给它们列别名。
现在标识符 SELECTBEW_WAARDE_NUMFROMV_BAE_ELEMENT_WAARDENBWHEREB.BOT_ID=BEW.BOT_IDANDB.BET_ID=740000000000638ANDB.BEW_DATUM_INGANG<=TRUNC(S
是没有空格的标量游标的开始。所以我猜 SSMS 需要命名列,并且由于您没有提供别名,因此使用 整个游标语句 生成它们。这比允许的 128 个字符长,因此出现错误。
(看来 SQL 开发人员足够聪明,可以将 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 服务器上的 运行 可能存在其他问题,例如使用特定于 Oracle 的 trunc(SYSDATE)
而不是其 MSSQL 类似物CONVERT (date, GETDATE())