微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决创建返回表的函数不起作用语法错误? 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”出现问题。

感谢您的帮助。

解决方法

首先 - 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,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('-',@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,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 大约快一百倍,启动代码少得多。

,
  1. 错误的参数名称:@InStr - 正确
  2. 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 + ','');
        INSERT INTO @TempTab(id) VALUES (@VALEUR);
    END;
RETURN;
end;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?