0

我正在检查我对 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 或更少的起始位置的文档是否错误,或者我的解释是否错误?

4

1 回答 1

2

您要连接的数据库服务器的版本很重要。它是解释和执行查询的服务器。

至于文档,SQL Server 2008 R2 和 SQL Server 2012 中似乎已经修复了一些混淆。

我在问题中找不到文档中的引号,但我发现了这一点,并且在 SQL Server 2008 中返回多少字符的描述是错误的,但我看不到它应该生成错误,除非您指定否定值作为长度。


SQL Server 2008 子串 (Transact-SQL)

如果 start_expression 小于 1,则返回的表达式将从 value_expression 中指定的第一个字符开始。在这种情况下,返回的字符数是 start_expression 和 length_expression 之和的最大值或 0。


SQL Server 2008 R2 子串 (Transact-SQL)

如果 start_expression 小于 1,则返回的表达式将从 value_expression 中指定的第一个字符开始。在这种情况下,返回的字符数是 start_expression + length_expression 之和的最大值 - 1 或 0。


SQL Server 2012 子字符串 (Transact-SQL)

如果 start 小于 1,则返回的表达式将从表达式中指定的第一个字符开始。在这种情况下,返回的字符数是 start + length-1 或 0 之和的最大值。

于 2013-09-10T05:47:00.063 回答