Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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 server 在行连接中传递给LEFT或SUBSTRING函数的长度参数无效_Sql Server_Substring_Charindex - Fatal编程技术网

Sql server 在行连接中传递给LEFT或SUBSTRING函数的长度参数无效

Sql server 在行连接中传递给LEFT或SUBSTRING函数的长度参数无效,sql-server,substring,charindex,Sql Server,Substring,Charindex,我在这个函数上得到了“传递给左或子字符串函数的长度参数无效”错误,它从字符串中获取数字,比如“Abracadabra{34}”,或者如果字符串没有“{}”,则不获取。 我有一个“案例”,但它似乎不能正常工作。 当然,它可以完美地处理典型案例——“Abracadabra{34}”,但由于查询中的复杂条件,我无法用其他案例检查此函数。 也许你只要看一眼就能发现错误。 请帮帮我 CREATE FUNCTION func ( @nidop int ) RETURNS varchar BEGIN DECL

我在这个函数上得到了“传递给左或子字符串函数的长度参数无效”错误,它从字符串中获取数字,比如“Abracadabra{34}”,或者如果字符串没有“{}”,则不获取。 我有一个“案例”,但它似乎不能正常工作。 当然,它可以完美地处理典型案例——“Abracadabra{34}”,但由于查询中的复杂条件,我无法用其他案例检查此函数。 也许你只要看一眼就能发现错误。 请帮帮我

CREATE FUNCTION func (
@nidop int
)
RETURNS varchar
BEGIN
DECLARE @sreturn varchar(1000);
SET @sreturn = '';
 SELECT 
 @sreturn = CASE CHARINDEX('{', wp.description) 
 WHEN 0 THEN @sreturn
 ELSE
 @sreturn + SUBSTRING(wp.description, CHARINDEX('{', wp.description) + 1,
 CHARINDEX('}', wp.description) - CHARINDEX('{', wp.description) - 1) + ','
 END 
 FROM
 (/*some select*/) ttt, RB_WORKPLACE wp
 WHERE wp.classified = ttt.ap 
ORDER BY CASE WHEN CHARINDEX('{', wp.[description]) > 0 THEN 
CONVERT(INT, 
SUBSTRING(wp.[description],
          CHARINDEX('{', wp.[description]) + 1,
          CHARINDEX('}', wp.[description]) - CHARINDEX('{', wp.[description]) - 1)
 )
 ELSE 0 
END;
 SET @sreturn = SUBSTRING(@sreturn, 1, LEN(@sreturn) - 1)
 RETURN @sreturn;
END;
我会尽量提供更多关于这个问题的信息。在此函数中,我尝试从Oracle迁移另一个函数:

create or replace function func(nidop in number) return varchar2 as
  sreturn varchar2(1000);  
begin
  select listagg(to_number(substr(wp.description, instr(wp.description, '{') + 1,
                                   instr(wp.description, '}') - instr(wp.description, '{') - 1)), ',') within group(order by to_number(substr(wp.description, instr(wp.description, '{') + 1, instr(wp.description, '}') - instr(wp.description, '{') - 1)))
    into sreturn
    from (/*some select*/) ttt, workplace wp
   where wp.classified = ttt.ap;
    return sreturn;

exception
  when others then
    return null;
end func;

我暂时将这个非我的查询改为类似“xml路径(“”)”的查询,谢谢大家的帮助。例如,只有一项是因为返回了varchar而不是varchar(50)。

错误来自您的orderby子句。您没有像在SELECT中那样将其包装在条件(
CASE
IIF
)中。将您的订单更改为以下内容:

 ORDER BY CASE WHEN CHARINDEX('{', wp.[description]) > 0 THEN 
 CONVERT(INT, 
    SUBSTRING(wp.[description],
              CHARINDEX('{', wp.[description]) + 1,
              CHARINDEX('}', wp.[description]) - CHARINDEX('{', wp.[description]) - 1)
     )
     ELSE 0 
    END;

另外,将返回类型简单地指定为
VARCHAR
而不指定长度也不是一个好主意。
VARCHAR
/
NVARCHAR
的默认宽度为1或30,具体取决于声明的上下文。由于您的局部变量被声明为
VARCHAR(1000)
,因此您应该使用相同的1000来声明输出类型。

您应该知道
SELECT@local\u variable=@local\u variable的某些函数
不是执行串联的可靠方法。文档特别警告说,不能保证表达式对每一行只计算一次,而且标量函数的效率非常低。您应该考虑更改为内联表值函数,而不是标量。另一个建议是使用ANSI-92样式连接,而不是使用这里使用的连接的过时版本。您还明显遗漏了这段代码中的一个重要部分,因为您有一个参数,但在您发布的代码中没有引用它。@SeanLange 1)但我需要使用结果字符串,可以吗?2) 我留下了一个大的选择,没有错误的功能,我很抱歉,但可能它提供了有关公司结构的信息。3) 我读了有关ANSI-92的信息,我明白了,谢谢。现在我将在未来使用ANSI-92(我不是很有经验的开发人员),虽然它不是我的全部查询,但我认为它不能解决这种情况下的问题。是的,您可以从表值函数得到结果。这就是他们的观点。只需确保您不使用多语句表值函数,否则您的性能将再次消失。从您发布的内容来看,这应该作为一个select语句轻松完成。是的,有一个错误,但不是主要错误。在讨论问题之后,我增加了“按顺序”条款。但是非常感谢你,我想我现在需要换个职位了。@Nixton,我现在很困惑。在我添加CASE语句之后,我就不再得到错误了。虽然现在我看到只有一个项目出现在
@sreturn
中,但这是一个不同的问题。但我没有停止:(是的,在函数的最后一行的SSMA调试中,我得到了完整的字符串,但不知怎的,在select中只得到了一个项目。我需要为这个问题创建不同的主题吗?我暂时将这个非我的查询更改为“xml路径(“”)”类似查询,谢谢大家的帮助。只有一项是因为返回了varchar而不是varchar(50)