【问题标题】:Getting Error Msg: Must declare the scalar variable获取错误消息:必须声明标量变量
【发布时间】:2019-02-10 02:40:45
【问题描述】:

我在 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,但它不能是一个标量值,它必须是一个表。

怎么了?

【问题讨论】:

  • 你想在这里实现什么?

标签: sql-server


【解决方案1】:

您正试图从标量值用户定义函数返回表变量。您需要转换下面给出的函数以将值存储到表值参数中。

另外,请阅读这篇 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);

【讨论】:

    【解决方案2】:

    其实你不需要创建用户定义的表类型。你可以直接给table而不是那个。

    查询

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

    【讨论】:

      【解决方案3】:

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

      这是我在这里作为示例代码在函数上下文中使用 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)
      

      【讨论】:

        【解决方案4】:

        表值参数有以下限制:

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-08-06
          • 2017-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多