得到错误消息:必须声明标量变量

时间:2018-09-05 04:02:29

标签: sql-server

我在SQL Server中使用了以下代码:

CREATE TYPE ExampleType AS TABLE (Number INT)
GO

CREATE FUNCTION GetExampleTableType(@InputNumber INT)
RETURNS ExampleType
AS
BEGIN
    DECLARE @OutputTable ExampleType;

    INSERT INTO OutputTable 
    VALUES (@InputNumber);

    RETURN(@OutputTable);
END;
GO

但是我得到一个错误:

  

必须声明标量变量“ @OutputTable”

我已经声明了@OutputTable,但是它不能是标量值,它必须是一个表。

怎么了?

4 个答案:

答案 0 :(得分:3)

您正试图从标量值用户定义函数返回表变量。您需要按如下所示转换函数,以将值存储到表值参数中。

此外,请阅读此StackOverFlow帖子,其中you cannot return UDT from table valued function

CREATE TYPE ExampleType AS TABLE (Number int)
GO

CREATE Function GetExampleTableType(@InputNumber int)
RETURNS Table
AS
RETURN
    (SELECT @InputNumber AS int);

DECLARE @OutputTable ExampleType
INSERT INTO @OutputTable
SELECT * FROM dbo.GetExampleTableType (1);

答案 1 :(得分:0)

实际上,您不需要创建用户定义的表类型。您可以直接给表,而不是给表。

查询

CREATE Function GetExampleTableType(@InputNumber int)
RETURNS @OutputTable TABLE
(
     Number int
)
AS
BEGIN
    INSERT INTO @OutputTable VALUES (@InputNumber);
    RETURN;
END;

答案 2 :(得分:0)

根据我的理解,我们可以使用表类型变量作为参数传递给函数和存储过程,但不能像问题中提到的那样在多状态网表值函数中使用。但是在您的示例中,您尝试在returns子句中访问tabletype变量,这在语法上是不正确的。

这是我在函数上下文中使用表类型变量的示例代码。.请让我知道是否有任何我想了解您的问题的东西...

  CREATE TYPE TableType 
  AS TABLE (LocationName VARCHAR(50))
  GO 


  CREATE FUNCTION Example( @TableName TableType READONLY)
  RETURNS VARCHAR(50)
  AS
  BEGIN
      DECLARE @name VARCHAR(50)
      SELECT @name = LocationName FROM @TableName
      RETURN @name
  END

  DECLARE @myTable TableType
  INSERT INTO @myTable(LocationName) VALUES('aaa')
  SELECT dbo.Example(@myTable)

答案 3 :(得分:0)

表值参数具有以下限制:

SQL Server不会维护表值参数列的统计信息。

表值参数必须作为输入READONLY参数传递给Transact-SQL例程。您不能对例程主体中的表值参数执行DML操作,例如UPDATE,DELETE或INSERT。

不能将表值参数用作SELECT INTO或INSERT EXEC语句的目标。表值参数可以位于SELECT INTO的FROM子句中,也可以位于INSERT EXEC字符串或存储过程中。

参考:https://docs.microsoft.com/en-us/sql/relational-databases/tables/use-table-valued-parameters-database-engine?view=sql-server-2017