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就可以了.  游标尽量少用. 请参考下面的代码

 /*created by SinooSoft.com at 2014.04.17*/
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 版本的类型提示。更不用说像 mypytyping 模块反向移植到实现类型注释的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 函数的长度参数无效。的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA - 将参数参数传递给 Sub

将数据集合从 .NET 传递给 PL/SQL 包过程或函数?

sql server截取某个特定字符前的字符串

如何将参数从 bat 文件或命令行传递给 plpgsql 函数?

将 R 变量传递给 RODBC sql 查询? [复制]

如何从 Javascript 提示框中获取值并将其传递给 PHP 变量以便能够保存在 SQL 中?