Sql server 创建返回表不';t工作语法错误?SQL

Sql server 创建返回表不';t工作语法错误?SQL,sql-server,tsql,set-returning-functions,Sql Server,Tsql,Set Returning Functions,您好,我需要发出一个sql请求,该请求在“WHERE(abc in@par1,@par2…”中接受多个参数 为此,我找到了一些使用sql函数的解决方案。我试图使用它,但没有成功。 我正在工作台上工作,这是我的功能代码 CREATE function MultiStringToTable (InStr VARCHAR(255)) RETURNS @TempTab TABLE( id nvarchar(255) not null ) AS BEGIN -- Ensu

您好,我需要发出一个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;
CREATE function MultiStringToTable(InStr VARCHAR(255))
返回@testab表(
id nvarchar(255)不为空
)
像
开始
--确保输入以逗号结尾
设置@InStr=REPLACE(@InStr+'、'、'、'、'和');
声明@SP INT;
宣布@VALEUR VARCHAR(1000);
而PATINDEX('%,%',@INSTR)0
设置@SP=PATINDEX(“%,%”,@INSTR);
设置@VALEUR=左(@INSTR,@SP-1);
设置@INSTR=STUFF(@INSTR,1,@SP,);
在@TELTAB(id)值(@VALEUR)中插入;
终止
回来
终止
它会导致“@testab”出现问题

谢谢你的帮助

  • 错误的参数名称:@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;
    
    CREATE function MultiStringToTable(@InStr VARCHAR(255))
    返回@testab表(
    id nvarchar(255)不为空
    )
    像
    开始
    --确保输入以逗号结尾
    设置@InStr=REPLACE(@InStr+'、'、'、'、'和');
    声明@SP INT;
    宣布@VALEUR VARCHAR(1000);
    而PATINDEX('%,%',@INSTR)0
    开始
    设置@SP=PATINDEX(“%,%”,@INSTR);
    设置@VALEUR=左(@INSTR,@SP-1);
    设置@INSTR=STUFF(@INSTR,1,@SP,);
    在@TELTAB(id)值(@VALEUR)中插入;
    终止
    回来
    终止
    
    首先-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
    
    完成。更好的是,您可以有任意数量的逗号,它们将被视为一个。请注意以下更改:

    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的速度大约是100倍,启动代码也少得多。

    停止再发明轮子。通过简单的搜索可以找到许多编写良好的拆分器函数。或者更好:使用表值参数
    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.