【问题标题】:Getting syntax error while using table variable in table value function in SQL Server 2012在 SQL Server 2012 的表值函数中使用表变量时出现语法错误
【发布时间】:2015-11-06 15:52:37
【问题描述】:

我正在尝试将表变量与表值函数一起使用,但出现语法错误。请帮我解决这个问题。

代码如下:

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 语句。

【问题讨论】:

  • 那是你的完整代码吗?我没有看到 RETURN 声明。
  • 这似乎是一种拆分分隔字符串的尝试。从性能的角度来看,while 循环方法是绝对最糟糕的方法。使用它会削弱您的查询。查看这篇文章,了解一些更好的选择。 sqlperformance.com/2012/07/t-sql-queries/split-strings
  • 如果你真的收到这个错误信息,只需删除 RETURN-Statement 后面的数字即可。所以如果你有 RETURN 0 就写 RETURN
  • 函数中包含的 Select 语句无法将数据返回给客户端。 @Results 在哪里插入?
  • @GordonLinoff:是的,这是完整的代码。如果我尝试添加 Return 语句,则会收到另一个错误,即“不能在此上下文中使用具有返回值的 RETURN 语句。”

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

如果你想使用你的功能,那么下面的工作版本。但是有更好的解决方案,请看:

.

CREATE FUNCTION [dbo].[SplitStrings1] 
( @List       NVARCHAR(MAX)
, @Delimiter  NVARCHAR(255))
RETURNS @Results TABLE
(Number INT, Item NVARCHAR(MAX) )
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 

   insert into @Results
   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
  RETURN 
END        

或者尝试类似的方法:

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

【讨论】:

  • 请不要!!!这是编写拆分器的绝对最糟糕的方法。像这样的循环对于性能来说非常糟糕。有比使用 while 循环更好的方法来编写拆分器。 sqlperformance.com/2012/07/t-sql-queries/split-strings
  • @SeanLange 非常感谢。这是一个非常有趣的信息。我将在我的数据库中使用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2018-07-12
相关资源
最近更新 更多