SQL函数问题,提示传递给 LEFT 或 SUBSTRING 函数的长度参数无效。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL函数问题,提示传递给 LEFT 或 SUBSTRING 函数的长度参数无效。相关的知识,希望对你有一定的参考价值。
CREATE FUNCTION a
(
@a varchar(200)
)
RETURNS int
AS
BEGIN
DECLARE @result int ;
DECLARE @ch varchar(200) ;
DECLARE @temp table(ID varchar(200));
--分割字符串
WHILE(@a<>'')
BEGIN
SET @ch=left(@a,charindex(',',@a,1)-1)
INSERT @temp VALUES(@ch)
SET @a=stuff(@a,1,charindex(',',@a,1),'')
END
--游标遍历@temp 临时表进行求和
DECLARE _CURSOR CURSOR FOR SELECT ID FROM @temp --定义游标
OPEN _CURSOR
FETCH NEXT FROM _CURSOR INTO @ch
WHILE(@@FETCH_STATUS=0)
BEGIN
SELECT @result=@result+pirce FROM A where id=@ch;
FETCH NEXT FROM _CURSOR INTO @ch
END
RETURN @result
END
GO
这个函数建好了之后,我用select dbo.a('"0100","0200","0300"')
出现提示传递给 LEFT 或 SUBSTRING 函数的长度参数无效。
这个是表A
题主给出的函数当获取到最后一个ID时,因为找不到逗号,所以造成"长度无效"的报错
因为最后一个ID无法根据逗号移除, 会造成死循环
给函数传参的时候不需要加双引号
游标在本函数中不需要使用. 直接用sum就可以了. 游标尽量少用. 请参考下面的代码
IF OBJECT_ID('A','U') IS NOT NULL DROP TABLE A
select '0100' id,50 price
INTO A
union all select '0200',70
union all select '0300',35
union all select '0400',55
union all select '0500',40
union all select '0600',85
go
IF OBJECT_ID('Func_A','FN') IS NOT NULL DROP function Func_A
go
CREATE FUNCTION Func_A
(
@a varchar(200)
)
RETURNS int
AS
BEGIN
DECLARE @result int ;
DECLARE @ch varchar(200) ;
DECLARE @temp table(ID varchar(200));
--分割字符串
WHILE(@a<>'')
BEGIN
IF(RIGHT(@a,1)<>',') SET @a=@a+','
SET @ch=left(@a,charindex(',',@a,1)-1)
INSERT @temp VALUES(@ch)
SET @a=stuff(@a,1,charindex(',',@a,1),'')
END
/*能不用游标就尽量不用*/
SELECT @result = SUM(price) FROM A JOIN @temp b ON b.id=A.ID
RETURN @result
END
GO
select dbo.Func_a('0100,0200,0300')
/*created by SinooSoft.com at 2014.04.17*/
结果为 155
参考技术A 应该是最后没有逗号,用逗号的位置得到的参数-1后是负数,不能做LEFT和SUBSTRING的参数。要改一下循环的条件,先判断有没有逗号。
或者在取子串时判断也可以。 参考技术B 你检查一下你函数里面的循环吧。。。那个不是个死循环么。。
类型提示。如何暗示传递给函数的对象必须具有某种方法/属性访问权限?
【中文标题】类型提示。如何暗示传递给函数的对象必须具有某种方法/属性访问权限?【英文标题】:Type hinting. How to hint that object passed to a function must have some method/attribute access? 【发布时间】:2020-05-31 14:27:57 【问题描述】:请看一个使用 numpy doctstring 进行类型提示的示例:
def my_function(obj):
"""Do some work.
Parameters
----------
obj : Any class with `do_work()` method
Returns
-------
None
"""
time.sleep(5)
我想知道是否有办法告诉调用者函数需要具有do_work
方法的对象?有没有办法使用python3
/mypy 类型提示或/和 numpy 文档字符串来指定此类类型提示?
【问题讨论】:
看来你的标签无效,python-2.7 没有对类型注解的语法支持 @Azat Ibrakov Python-2.7 具有文档字符串,因此具有 numpy 样式的文档字符串。 Pycharm 用于 python2 版本的类型提示。更不用说像mypy
和 typing
模块反向移植到实现类型注释的python2了
接受的答案使用 Python2.7 不支持的语法,这就是我所说的
@AzatIbrakov 不,您是说该问题的标签无效。接受的答案可以在 python 2.7 中与 mypy 一起使用而没有任何问题(尽管使用 typing_extensions 包)而且我的猜测是,如果我使用接受的 andswer 语法在 pycharm 中实现我自己的 typeshed 文件,我也会遇到零问题。这就是使接受的答案对 python 2 也有效的原因
【参考方案1】:
定义一个Protocol
import typing
class Worker(typing.Protocol):
def do_work(self):
pass
class SomeWorker:
def do_work(self):
print("Working...")
def my_function(obj: Worker):
obj.do_work()
x = SomeWorker()
my_function(x) # This will type check; `SomeWorker` doesn't have to inherit from Worker
【讨论】:
以上是关于SQL函数问题,提示传递给 LEFT 或 SUBSTRING 函数的长度参数无效。的主要内容,如果未能解决你的问题,请参考以下文章
将数据集合从 .NET 传递给 PL/SQL 包过程或函数?