为啥我的代码中的 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”替换?的主要内容,如果未能解决你的问题,请参考以下文章