Sql ';传递给左或子字符串函数的长度参数无效';何时/不';不存在
我有一个存储过程,应该在/character之后提取所有字符。但是,有时该字段将不具有该字符,因此它将不返回任何内容,有时该字段将为null,再次,它将不返回任何内容。如果/字符存在,我使用的SQL可以工作,但是如果它不存在,我会在标题中得到错误。以下是SQL:Sql ';传递给左或子字符串函数的长度参数无效';何时/不';不存在,sql,sql-server,substring,Sql,Sql Server,Substring,我有一个存储过程,应该在/character之后提取所有字符。但是,有时该字段将不具有该字符,因此它将不返回任何内容,有时该字段将为null,再次,它将不返回任何内容。如果/字符存在,我使用的SQL可以工作,但是如果它不存在,我会在标题中得到错误。以下是SQL: COALESCE(NULLIF(SUBSTRING(s.billing_dept,1, CASE WHEN CHARINDEX('/', s.billing_dept) = 0 THEN 0
COALESCE(NULLIF(SUBSTRING(s.billing_dept,1,
CASE WHEN CHARINDEX('/', s.billing_dept) = 0
THEN 0
ELSE (LEN(s.billing_dept)-1) - CHARINDEX('/', s.billing_dept)
--END,
--CASE WHEN CHARINDEX('/', s.billing_dept) = 0
-- THEN 1
-- ELSE ((LEN(s.billing_dept)-1) - CHARINDEX('/', s.billing_dept))
END),''),'')
如果字符串以
'/'
如果希望所有字符都位于'/'
之后,则应使用以下命令:
CASE CHARINDEX('/', s.billing_dept)
WHEN 0 THEN
''
ELSE
SUBSTRING(s.billing_dept, CHARINDEX('/', s.billing_dept) + 1, LEN(s.billing_dept) - CHARINDEX('/', s.billing_dept))
END
您可以尝试以下方法:
CREATE TABLE #teststrings(test nvarchar(20))
INSERT INTO #teststrings(test)
VALUES (null), (N'Hiho!'), (N'Cool/String'), (N'Cooler / String'), (N'Stupid String /')
SELECT s.test,
SUBSTRING(s.test,1,
CASE WHEN CHARINDEX(N'/',s.test) = 0
THEN LEN(s.test)
ELSE CHARINDEX(N'/',s.test)-1
END
) as string_before,
SUBSTRING(s.test,CHARINDEX(N'/',s.test)+1,LEN(s.test)) as string_after
FROM #teststrings as s
DROP TABLE #teststrings
我两者都提供了。一个版本将在/
前面获取所有内容,该版本在之前称为string\u,另一个版本将在/
之后提供所有内容,该版本在之后称为string\u
此外,我还为测试提供了五种不同的测试字符串
结果如下:
test string_before string_after
-------------------- -------------------- --------------------
NULL NULL NULL
Hiho! Hiho! Hiho!
Cool/String Cool String
Cooler / String Cooler String
Stupid String / Stupid String
如果需要和愿意,您仍然可以ltrim/rtrim
。此解决方案将在SQL Server 2005上运行到最新版本。以下是我自己的方法,其中有一个更简单的函数,用于在/之后获取字符:
DECLARE @test TABLE (string VARCHAR(10))
INSERT INTO @test (string) VALUES ('/abc'),('a/bc'),('ab/c'),('abc/'),('abc'),(NULL)
SELECT
string,
output = CASE CHARINDEX('/',string)
WHEN 0 THEN NULL --if / not found, return null
WHEN LEN(string) THEN NULL --if / is last char, return null
ELSE RIGHT(string,LEN(string)-CHARINDEX('/',string)) --return all chars after /
END
FROM @test
LEN(s.billing_dept)-1
可能返回-1
,如果string=NULL,CHARINDEX('/',NULL)=NULL@DLeh不,它不能,因为如果它是空的,那么里面就不可能有/
,所以会对案例的另一面进行评估。LEN(“/”)-1-CHARINDEX(“/”,“/”)
将返回-1
啊,是的,整个表达式可能返回-1。但是OP说错误发生在没有/
时。
string output
===============
/abc abc
a/bc bc
ab/c c
abc/ NULL
abc NULL
NULL NULL