我正在检查我对 SSMS 版本 2008 中的 SUBSTRING 的理解。
我不知道 start_expression 是基于 0 还是 1,如果是基于 0,我不明白允许 start_expression 为 0 的目的。
我运行了查询;
DECLARE @Test VARCHAR(5) = 'Hello'
SELECT @Test, SUBSTRING(@Test, 1, 4), 'What the ' + SUBSTRING(@Test, 0, 5) + '?', + SUBSTRING(@Test, -1, 6)
产生了结果;
你好,到底是什么?地狱
现在 SQL Server 2008 BOL 状态;
start_expression 是一个整数或 bigint 表达式,它指定返回的字符从何处开始。如果 start_expression 小于 0,则会生成错误并终止语句。如果 start_expression 大于 value 表达式中的字符数,则返回零长度表达式。
甚至更高版本的 2008R2 或 2012 都表明;
如果 start_expression 小于 1,则返回的表达式将从 value_expression 中指定的第一个字符开始。
然而,我上面的 SQL 语句的最后一列允许我从 -1 开始并提取 6 个字符。
我尝试过的两台服务器都运行 2008 R2(一个 (SP2) - 10.50.4000.0 (X64) 和另一个 R2 (RTM) - 10.50.1600.1 (X64))
所以我的问题是——什么决定了通过 SSMS 执行的 SQL 版本?是 SSMS 版本本身、数据库服务器、数据库(我执行此操作的数据库之一是在 2005 兼容模式下的 2008 服务器上)?
此外,关于 0 或更少的起始位置的文档是否错误,或者我的解释是否错误?