创建返回表的函数不起作用语法错误? SQL

Posted

技术标签:

【中文标题】创建返回表的函数不起作用语法错误? SQL【英文标题】:Create function that returns table doesn't work syntax error? SQL 【发布时间】:2021-05-06 12:29:42 【问题描述】:

您好,我需要发出一个 sql 请求,该请求在 'WHERE (abc IN @par1, @par2 ....' 为此,我找到了一些使用 sql 函数的解决方案。我尝试使用它没有任何成功。 我正在工作台上工作,这是我的功能代码。

CREATE function MultiStringToTable (InStr VARCHAR(255))
    RETURNS @TempTab TABLE(
   id nvarchar(255) not null
   )
   AS
BEGIN
    -- Ensure input ends with comma
    SET @InStr = REPLACE(@InStr + ',', ',,', ',');
    DECLARE @SP INT;
    DECLARE @VALEUR VARCHAR(1000);
    WHILE PATINDEX('%,%', @INSTR ) <> 0 

        SET @SP = PATINDEX('%,%',@INSTR);
        SET @VALEUR = LEFT(@INSTR , @SP - 1);
        SET @INSTR = STUFF(@INSTR, 1, @SP, '');
        INSERT INTO @TempTab(id) VALUES (@VALEUR);
    END;
RETURN;
end;

这会导致“@TempTab”出现问题。

感谢您的帮助。

【问题讨论】:

停止重新发明***。通过简单的搜索,您可以找到许多编写良好的拆分器函数。 或者更好:使用表值参数 【参考方案1】:

首先 - Artem 打败了我,但正确的代码是:

CREATE function MultiStringToTable (@InStr VARCHAR(255))
RETURNS @TempTab TABLE(id nvarchar(255) not null)
AS
BEGIN
    -- Ensure input ends with comma
    SET @InStr = REPLACE(@InStr + ',', ',,', ',');
    DECLARE @SP INT;
    DECLARE @VALEUR VARCHAR(1000);
    WHILE PATINDEX('%,%', @INSTR ) <> 0 
    BEGIN
        SET @SP = PATINDEX('%,%',@INSTR);
        SET @VALEUR = LEFT(@INSTR , @SP - 1);
        SET @INSTR = STUFF(@INSTR, 1, @SP, '');
        INSERT INTO @TempTab(id) VALUES (@VALEUR);
    END;
RETURN;
END;
GO

也就是说 - ^^^ 这将非常缓慢。对于您正在做的事情,您可以使用STRING_SPLIT。

DECLARE @instr VARCHAR(8000) = 'abc,,xxx,yyy,,z';

SELECT split.* FROM STRING_SPLIT(@instr,',') AS split WHERE  split.[value] > '';

完成。更好的是,您可以有任意数量的逗号,它们将被视为一个。请注意以下更改:

DECLARE @instr VARCHAR(8000) = 'abc,,,,xxx,,yyy,,z,w,,,,sss,,';

这会返回:

value
----------
abc
xxx
yyy
z
w
sss

为了了解性能差异,让我们做一个快速测试。

PRINT CHAR(10)+'STRING_SPLIT'+CHAR(10)+REPLICATE('-',90);
GO
DECLARE @st DATETIME = GETDATE(), @x VARCHAR(8000);

 SELECT      @x = split.[value] 
 FROM        #strings AS s
 CROSS APPLY STRING_SPLIT(s.String,',') AS split
 WHERE  split.[value] > ''

PRINT DATEDIFF(MS,@st,GETDATE());
GO 3

PRINT CHAR(10)+'dbo.MultiStringToTable'+CHAR(10)+REPLICATE('-',90);
GO
DECLARE @st DATETIME = GETDATE(), @x VARCHAR(8000);

 SELECT      @x = split.id 
 FROM        #strings AS s
 CROSS APPLY dbo.MultiStringToTable(s.String) AS split
 WHERE  split.id > '';

PRINT DATEDIFF(MS,@st,GETDATE());
GO 3

STRING_SPLIT
--------------------------------------------------------------------------------------
Beginning execution loop
140
184
153
Batch execution completed 3 times.

dbo.MultiStringToTable
--------------------------------------------------------------------------------------
Beginning execution loop
14046
14174
14466
Batch execution completed 3 times.

STRING_SPLIT 大约快一百倍,而且启动的代码少得多。

【讨论】:

【参考方案2】:
    错误的参数名称:@InStr - 正确 WHILE 后缺少 BEGIN 关键字

正确版本:

CREATE function MultiStringToTable (@InStr VARCHAR(255))
    RETURNS @TempTab TABLE(
   id nvarchar(255) not null
   )
   AS
BEGIN
    -- Ensure input ends with comma
    SET @InStr = REPLACE(@InStr + ',', ',,', ',');
    DECLARE @SP INT;
    DECLARE @VALEUR VARCHAR(1000);
    WHILE PATINDEX('%,%', @INSTR ) <> 0 
    BEGIN
        SET @SP = PATINDEX('%,%',@INSTR);
        SET @VALEUR = LEFT(@INSTR , @SP - 1);
        SET @INSTR = STUFF(@INSTR, 1, @SP, '');
        INSERT INTO @TempTab(id) VALUES (@VALEUR);
    END;
RETURN;
end;

【讨论】:

以上是关于创建返回表的函数不起作用语法错误? SQL的主要内容,如果未能解决你的问题,请参考以下文章

使用 JPA 解析琐碎查询的语法错误

即使创建表的语法正确,我的 sql 中也会出现错误 1064

PostgreSQL 8.1 中的 SQL 函数“RETURNS TABLE”语法错误

mysql数据库创建表的时候,出现您的SQL语法有错误

使用字符串列旋转 SQL 表的语法错误

get-pip.py 的 curl 不起作用:语法错误