为啥我的代码中的 SQL 命令在运行时被“TODO: FUNC”替换?

Posted

技术标签:

【中文标题】为啥我的代码中的 SQL 命令在运行时被“TODO: FUNC”替换?【英文标题】:Why is a SQL command in my code replaced by "TODO: FUNC" at runtime?为什么我的代码中的 SQL 命令在运行时被“TODO: FUNC”替换? 【发布时间】:2019-06-18 16:07:42 【问题描述】:

我正在设置一个 .NET 程序来处理我们 Redshift 数据库中的一些数据。我的大多数命令都没有问题,但是当我尝试在 select 中执行涉及 CONVERT 函数的 INSERT 语句时,它会用文本“TODO:FUNC”替换整个 CONVERT 函数,然后我得到这个错误:

System.Data.Odbc.OdbcException (0x80131937):错误 [42601] [Amazon][Amazon Redshift] (30) 尝试执行查询时发生错误:[SQLState 42601] 错误:在“或附近出现语法错误: " 第 1 行:...当 package_size 为 null 然后为 null 时的情况 TODO: FUNC end...

SQL 命令从 Aginity Workbench 运行时没有错误。如果我取出 CONVERT 函数,我会收到我的类型不匹配的错误。

OdbcConnection conn = new OdbcConnection(connString);
conn.Open();

string sql = "truncate table sch.table; insert into sch.table (package_size) select case when package_size is null then null else convert(numeric(9,3),left(package_size,6) || '.' || right(package_size,3)) end as package_size from sch.stage_table;";

OdbcCommand da = new OdbcCommand(sql, conn);
da.ExecuteNonQuery();

conn.Close();

【问题讨论】:

管道 (||) 有什么用? 这是 Redshift 连接运算符。如果我将其更改为使用 CONCAT(s1,s2),我会得到同样的错误。 啊...好的。我不熟悉 Redshift 语法。 【参考方案1】:

出于任何原因,此场景中的 CONVERT 函数不起作用。但是您可以使用 CAST 来代替它。

CAST ( expression AS type )
expression :: type

在你的情况下:

cast(left(package_size,6) || '.' || right(package_size,3) as numeric(9,3))

官方文档:https://docs.aws.amazon.com/redshift/latest/dg/r_CAST_function.html

【讨论】:

您应该将答案添加为文本。链接可能有一天会被破坏。

以上是关于为啥我的代码中的 SQL 命令在运行时被“TODO: FUNC”替换?的主要内容,如果未能解决你的问题,请参考以下文章

为啥<br>命令没起到换行作用,而在程序运行时被输出

为啥我的弹性 beantalk 实例在我部署时被替换?

为啥我的 Access 报告在打印时被切断?

为啥我的 POST 请求在部署时被 CORS 阻止但它在本地工作

为啥 Pycharm 不突出 TODO 的?

如果我们应用类型擦除,哪些重载方法将在运行时被调用,为啥?