我在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
,但是它不能是标量值,它必须是一个表。
怎么了?
答案 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字符串或存储过程中。