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