c# - 为什么我的代码中的 SQL 命令在运行时被“TODO: FUNC”替换?
问题描述
我正在设置一个 .NET 程序来操作我们 Redshift 数据库中的一些数据。我的大多数命令都没有问题,但是当我尝试在 select 中执行涉及 CONVERT 函数的 INSERT 语句时,它会用文本“TODO:FUNC”替换整个 CONVERT 函数,然后我得到这个错误:
System.Data.Odbc.OdbcException (0x80131937):错误 [42601] [Amazon][Amazon Redshift] (30) 尝试执行查询时发生错误:[SQLState 42601] 错误:“:”第 1 行或附近的语法错误: ...如果 package_size 为空,则为空,否则 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();
解决方案
出于任何原因,此场景中的 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
推荐阅读
- javascript - PrimeNG 中的 Google 地图未呈现
- python - python 谷歌云函数本地依赖
- servlets - 我不明白 Servlet Specification 3.1 第 2 章关于 servlet 初始化
- javascript - 我如何使用 jest 来确保我只使用两个参数?
- google-analytics - GTM & Google Analytics 4 // 购买多个产品的事件
- linux-kernel - 内核模块编译的内核头文件
- reactjs - Material-ui 主题组件库中的自托管字体不起作用
- c# - c#函数接受和处理类型T的对象
- java - 使用 ng-flow 上传多个文件
- c - 递归函数中局部变量的地址减少