Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ';传递给左或子字符串函数的长度参数无效';何时/不';不存在_Sql_Sql Server_Substring - Fatal编程技术网

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

我有一个存储过程,应该在/character之后提取所有字符。但是,有时该字段将不具有该字符,因此它将不返回任何内容,有时该字段将为null,再次,它将不返回任何内容。如果/字符存在,我使用的SQL可以工作,但是如果它不存在,我会在标题中得到错误。以下是SQL:

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