适用于多种数据类型的通用 SQL UPDATE 子句

Posted

技术标签:

【中文标题】适用于多种数据类型的通用 SQL UPDATE 子句【英文标题】:Generic SQL UPDATE clause suitable for mutliple data types 【发布时间】:2021-06-28 15:18:14 【问题描述】:

对 SQL 相当陌生。假设我有一个表,其中字段 1 的类型为字符串 (VARCHAR),字段 2 的类型为整数 (INTEGER)。据我了解,您应该将='newValue' 用于字符串字段,将=newValue 用于整数字段(而=#newValue# 用于日期字段)。

有没有一种技巧可以在不需要提前知道要更新的字段类型的情况下实现 SET 子句的通用构造?

void UpdateDatabase(string field, string oldValue, string newValue)

    // Construct without needing work out whether '', ## or (nothing) is required?
    string sqlUpdate = (
        "UPDATE MyTable" +
        " SET " + field + " = " + newValue +
        " WHERE " + field + " = " + oldValue);
    // Execute the statement on the database

这可以按如下方式使用:

UpdateDatabase("field1", "Danger Mouse!", "Mickey Mouse");
UpdateDatabase("field2", "15", "7");

【问题讨论】:

并非如此,但您应该使用 SQL 参数,而不是将值连接到查询字符串中。 标记您正在使用的数据库。您打算做的是有点可疑,但最终会更好地由 sql 存储过程来处理,该过程可以访问 information_schema 表,而不是客户端代码。 我强烈建议为每个表单独编码,或者使用诸如 Dapper 或实体框架之类的 ORM。无论你做什么,使用参数 【参考方案1】:

如果您想预先确定要插入的字段的数据类型,您的代码将需要复杂得多。

大多数 SQL 风格都有某种目录,因此例如在 MS SQL Server 上,您需要执行以下操作:

SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MyTable' AND COLUMN_NAME = 'field'

对于您要写入的每一列,然后根据数据类型应用或不应用单引号。 有这样做的方法和方法,并且取决于您要同时写入多少个不同的字段,这将取决于获取列数据类型的逻辑必须有多复杂。 对于大量列,理想情况下,您首先将要写入的所有列名收集到一个表中,然后使用该表查询数据类型

但是,在 SQL Server 中,您通常可以将单引号括在所有内容上,甚至是整数和浮点数。 SQL Server 将根据需要智能地删除单引号。

您似乎在使用 mysql,因为您需要在日期周围加上哈希值,在这种情况下,对于您的损失,我深表歉意。

【讨论】:

其实我继承了一个老项目,还在使用DAO和Microsoft Access 97,正在升级到ODBC、OleDB或者SQL Server。 正确使用参数,尤其是已经查询过数据类型的时候 ODBC 和 OLEDB 是连接方式,而不是数据库。 Access 97 是有史以来设计的最糟糕的数据库引擎之一,我会尽快切换到 SQL Server,然后这个数据类型问题就会消失,因为您可以单引号插入所有内容。

以上是关于适用于多种数据类型的通用 SQL UPDATE 子句的主要内容,如果未能解决你的问题,请参考以下文章

sql中in和exist语句的区别?

面向对象的设计来模拟通用设备

如何在SQL中使用JOIN执行UPDATE语句?

AWS Athena:不支持的相关子查询类型,但它适用于 Mysql 和其他风格

QNX Hypervisor 2.2用户手册]10.1 通用vdev选项

MySQL数据类型 - 数字类型 - 数字类型语法