我尝试使用LEFT结合CHARINDEX从表中的列中提取子字符串但是它给出了以下错误
消息537,级别16,状态2,行1传递给的长度参数无效 LEFT或SUBSTRING功能。
select name, left(name, charindex('\',name) - 1) as sub
from sys.servers
但是,如果我使用变量在单个字符串上应用相同的字符串,那么它就可以工作..
declare @mytext varchar(max)
set @mytext = 'hello\world'
SET @MyText = LEFT(@MyText, CHARINDEX('\', @MyText) - 1)
print @mytext
O/P:
----
hello
请让我知道我做错了什么?
答案 0 :(得分:1)
问题是name
可能没有反斜杠。这很容易修复,但这取决于你想要的结果。当没有反斜杠时,这会给出全名:
select name,
left(name, charindex('\', name + '\') - 1) as sub
from sys.servers;
问题是charindex()
在值不存在时返回0
- 这是left()
的长度错误。
答案 1 :(得分:0)
你可以做的是使用IIF for SQL 2012 +或Case来避免文本中没有'\'时的错误
declare @mytext varchar(max)
set @mytext = 'hello world'
SET @MyText = LEFT(@MyText, iif(CHARINDEX('\', @MyText)>0,CHARINDEX('\', @MyText) - 1,len(@mytext)))
print @mytext
CASE
SET @MyText = LEFT(@MyText,
CASE
WHEN CHARINDEX('\', @MyText) > 0 THEN CHARINDEX('\', @MyText) - 1
ELSE LEN(@mytext)
END)
PRINT @mytext
答案 2 :(得分:0)
如果在名称中找不到'\',它将给出0,因此最终结果将保留(name,-1),这是无效的。因此,您需要以这样的方式编写代码:如果存在-1,则需要将其视为0.下面的代码修复了该问题。
select name, left(name, ISNULL(NULLIF(charindex('\',name) - 1,-1),0)) as sub from sys.servers