Sql server 为T-SQL中的子字符串长度参数指定字符串长度

Sql server 为T-SQL中的子字符串长度参数指定字符串长度,sql-server,tsql,Sql Server,Tsql,根据本文并使用子字符串: 子字符串(值表达式、开始表达式、长度表达式) 长度表达式 是一个正整数或bigint表达式,用于指定 将返回值\表达式的字符。如果 长度_表达式为负数,将生成一个错误并返回语句 终止如果开始表达式和长度表达式之和为 大于value_表达式中的字符数,则整个 返回从开始处开始的值表达式\u表达式。 如果我有: DECLARE @data varchar(max) SELECT TOP 1 @data = Data FROM [SomeDatabase].[dbo

根据本文并使用子字符串:

子字符串(值表达式、开始表达式、长度表达式)

长度表达式

是一个正整数或bigint表达式,用于指定 将返回值\表达式的字符。如果 长度_表达式为负数,将生成一个错误并返回语句 终止如果开始表达式和长度表达式之和为 大于value_表达式中的字符数,则整个 返回从开始处开始的值表达式\u表达式。

如果我有:

DECLARE @data varchar(max)

SELECT TOP 1 @data = Data
    FROM [SomeDatabase].[dbo].[MyTable]

SELECT SUBSTRING(@data, 10, LEN(@data))
我的理解是,因为
子字符串
发现请求的长度大于提供的字符串长度,所以它将返回从开始索引到字符串结束的所有内容

例如,如果:

@data = "hey there"; // char length of 9
SUBSTRING(@data, 4, 20)
这应该返回
那里

这是一件特别糟糕的事情吗

这样做有什么警告吗


我应该明确返回字符串的长度吗?

我看不出这是件坏事的原因。我倾向于使用len(@string),当我确定的时候,我排除了我不想返回的部分,我想返回所有内容。对我来说,这似乎是合法的,这是一个非常有用的功能,IMHO
子字符串(@data,4,len(@data))
与编写
右侧(@data,LEN(@data)-4)几乎相同。
。但是,如果整个字符串长度小于指定的起始字符,
RIGHT
将返回一个错误(传递给RIGHT函数的长度参数无效),而
SUBSTRING
将返回一个空白,这可能更可取。