【问题标题】:Is there a way to turn off implicit type conversion in SQL Server?有没有办法在 SQL Server 中关闭隐式类型转换?
【发布时间】:2011-09-30 01:38:20
【问题描述】:

正如标题所示: 有没有办法在 SQL Server 中关闭隐式类型转换?

我希望下面的简单 SQL 生成错误

SELECT 'a' WHERE 1='1'

【问题讨论】:

  • 好问题,除了:为什么重要?经过十秒钟的思考,我想不出一个我会不小心比较两种不同类型的例子,但如果我是故意比较两种不同的类型,那么我想要转换...
  • 我认为这很重要,原因有很多。其中你提到的那个:偶然比较。我认为在给定字段的表中有一个用户定义的类型可能是一个键并且在另一个表中有一个外键会很好。我认为默认值应该是比较两个值时的 - 如果类型类型不同:失败。
  • 这是标准 SQL 的一个特性,Chris Date 将其归功于他的朋友 E. F. Codd,其想法是“有时用户会比 DBMS 知道的更多”。但 Date 认为这是一个误判:谷歌确切的短语 `"Codd-style domain checks" 了解更多详情。
  • 隐式类型转换会导致一些看起来很奇怪的错误。假设表 foo 有列 c 是 char 类型。然后select * from foo where c = 123 将导致奇怪的错误Conversion failed when converting the varchar value 'ABC' to data type int. 在我的查询中我没有要求将“ABC”转换为任何东西;相反,这个值在某处的 c 列中。如果 MSSQL 会在列类型为 char 时警告我我指定了一个 int 会更有帮助。

标签: sql sql-server


【解决方案1】:

没有办法禁用它。

它已被请求:请参阅来自 Erland Sommarskog 的提议的 SET OPTION STRICT ON MS Connect 请求

但是,根据datatype precedence 规则,它是完全可以预测的

您的外键示例很有趣,因为实际的 FOREIGN KEY 约束需要相同的数据类型、长度和排序规则。

【讨论】:

  • 问题是日期时间偏移和日期时间比较之类的东西。日期时间被隐式转换为 WITH +00:00 偏移量,而不是本地偏移量。在 99% 的时间里允许隐式转换并没有做你真正想做的事情。
【解决方案2】:

没有办法禁用 SQL Server 中的隐式转换,尽管一些搜索会显示这是很多人要求的。

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 2011-08-02
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    相关资源
    最近更新 更多