【问题标题】:What T-SQL standard is adhered to in this query此查询遵循什么 T-SQL 标准
【发布时间】:2013-09-10 03:24:46
【问题描述】:

我正在检查我对 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 大于值中的字符数 表达式,返回一个长度为零的表达式。

甚至更高版本的 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 或更少的起始位置的文档是否有误,或者我的解释是否错误?

【问题讨论】:

    标签: sql-server-2008 tsql substring ssms


    【解决方案1】:

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

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

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


    SQL Server 2008 SUBSTRING (Transact-SQL)

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


    SQL Server 2008 R2 SUBSTRING (Transact-SQL)

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


    SQL Server 2012 SUBSTRING (Transact-SQL)

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

    【讨论】:

    • 感谢您的信息。我发布的报价来自 SSMS 2008 BOL,因此它可能已过时且不正确。我仍然认为我当时对 doco 的解释是错误的,或者根本不正确。如果说如果 start 小于 1,则返回的表达式将从表达式中的第一个字符开始让我相信 SELECT SUBSTRING(@Test, 0, 5) 应该导致 Hello。我的假设是正确的,还是我遗漏了什么。
    • @MrMoose substring('hello', 0, 5) 将从表达式h 中的第一个字符开始,并返回start + length - 1 的字符数,即0 + 5 - 1 = 4,因此您会得到hell
    • ahhh,第五次重新阅读它允许它沉入。遵守长度值。感谢您指出这一点。
    • 顺便说一下,如果它有任何用途,显示上面引用的 2008 BOL URL 表示如果 start_expression 小于 0 则会出错 ms-help://MS.SQLCC.v10/ MS.SQLSVR.v10.en/s10de_6tsql/html/a19c808f-aaf9-4a69-af59-b1a5fc3e5c4c.htm
    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 2017-12-06
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多