Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server 2012的表值函数中使用表变量时出现语法错误_Sql_Sql Server_Tsql_Sql Server 2012 - Fatal编程技术网

在SQL Server 2012的表值函数中使用表变量时出现语法错误

在SQL Server 2012的表值函数中使用表变量时出现语法错误,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,我试图将表变量与表值函数一起使用,但遇到语法错误。请帮我解决这个问题 代码如下: Create FUNCTION [dbo].[SplitStrings1] (@List NVARCHAR(MAX), @Delimiter NVARCHAR(255)) RETURNS @Results TABLE(Col1 int) AS BEGIN declare @tblHelping table (Col1 int); declare @i int declare @

我试图将表变量与表值函数一起使用,但遇到语法错误。请帮我解决这个问题

代码如下:

Create FUNCTION [dbo].[SplitStrings1]
(@List       NVARCHAR(MAX),
@Delimiter  NVARCHAR(255))
RETURNS @Results TABLE(Col1 int)
AS
BEGIN
    declare @tblHelping table (Col1 int);
    declare @i int
    declare @rows_to_insert int

    set @i = 1
    set @rows_to_insert = 1000

    while @i < @rows_to_insert
    begin
        INSERT INTO @tblHelping VALUES (@i)
        set @i = @i + 1
    end 

    (SELECT 
         Number = ROW_NUMBER() OVER (ORDER BY Number),
         Item FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@List, Number, 
         CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)))
    FROM 
        (SELECT * FROM @tblHelping) AS n(Number)
    WHERE 
        Number <= CONVERT(INT, LEN(@List))
        AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter) AS y) 
END
我得到了这个错误

具有返回值的RETURN语句不能在此上下文中使用


如果您想使用您的功能,请参阅下面的工作版本。但有更好的解决方案,请参见:

推荐 @西兰热

或者尝试类似的方法:

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END

这是你的全部密码吗?我没有看到RETURN语句。这似乎是试图拆分分隔字符串。从性能的角度来看,while循环方法绝对是最糟糕的方法。使用此选项将削弱您的查询。看看这篇文章,有很多更好的选择。如果确实收到此错误消息,只需删除RETURN语句后面的数字即可。因此,如果您有return0,只需编写包含在函数中的RETURNSelect语句,就无法将数据返回到客户端。@Results中的insert在哪里?@GordonLinoff:是的,这是完整的代码。如果我尝试添加Return语句,那么我得到了另一个错误,即带有返回值的Return语句不能在此上下文中使用。请不要!!!这绝对是编写拆分器最糟糕的方式。这样的循环对性能来说太糟糕了。有比使用while循环更好的方法来编写拆分器@SeanLange非常感谢。这是一个非常有趣的信息。我将在我的数据库中使用它
CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END