例如:
SELECT DATEADD(month, 2, '2017/08/25') AS DateAdd;
我认为将参数定义为指定的数据类型(例如字符)会更有意义,就像 OBJECT_ID
函数中的 'U'
参数一样
IF OBJECT_ID('dbo.Digits', 'U') IS NOT NULL
DROP TABLE dbo.Digits;
那么从 month
到 'month'
定义参数在技术上不是更正确吗:
SELECT DATEADD('month', 2, '2017/08/25') AS DateAdd;
month
是 SQL 服务器中的数据类型吗?
我可以认为它类似于 C 中的宏,例如:
#define month "month"
那么 SQL 服务器中的 month
是什么?
回答1
MONTH
不是数据类型(在此上下文或任何其他上下文中),它是已定义的参数(将其视为常量)。 https://docs.microsoft.com/en-us/sql/t-sql/functions/dateadd-transact-sql。为什么它不包含在字符串中?您必须找到 30 年前编写代码的人并询问他们。该文件甚至说(使用 [my clarification added]
):
DATEADD 不接受用户定义的等效变量 [例如strings] 用于 datepart 参数。
https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-big-transact-sql 说得更好,恕我直言:
DATEDIFF_BIG 不接受来自用户定义变量的日期部分 values 或引用的字符串。
这可能是由于当时解析器的编写方式以及 30 年后没有理由更改它,因为有人不喜欢它。 :-) 除了上述两个函数之外,您还必须更改 DATENAME
、DATEDIFF
、DATEPART
等以保持一致。在 SQL 服务器生命周期的这个阶段,我只是看不到好处。
DATE*
函数并不孤单。像这样的另一个示例是 OPENQUERY
,您可以认为它应该能够为任一参数获取变量,或者为第一个参数获取代表服务器的字符串(与 OPENDATASOURCE
和 OPENROWSET
更加一致)。但是https://docs.microsoft.com/en-us/sql/t-sql/functions/openquery-transact-sql指出:
OPENQUERY 的参数不接受变量。
接下来,你问:
所以从技术上定义从月份到“月份”的参数不是更正确吗:
也许?对我来说似乎很主观。很多事情在技术上会比它们当前的实现更正确(我的意思是,想象一下如果每个软件的 v1.0 在各个方面都是完美的),但这并不能使它们易于更改,仅此一点也不总能提供良好的动力考虑改变。