如何在函数中向用户定义的表类型插入多个值


------------------CREATING THE UDDT--------------------------------------
Create type audit.table_list AS TABLE
(
table_name nvarchar(50),     
)
-----------------CREATING THE FUNCTION-----------------------------------    
CREATE OR ALTER FUNCTION [dbo].[test1] (@list audit.table_list readonly) 
returns nvarchar(255) 

as
Begin
DECLARE @name varchar(50)
select  @name = table_name from @list
return @name
end 
-----------------------------------------------------------
----SELECTING THE RETURNED FUNCTION------------------------
DECLARE @audit audit.table_list
INSERT INTO @audit(table_name) VALUES('aa'),('bb')
SELECT dbo.test1(@audit)
---Alternative I tried which was not able to return----
CREATE FUNCTION [dbo].[test] (@list audit.table_list readonly) 
returns @table_list table (table_name nvarchar(255)) 
as
Begin
DECLARE @Modifieduddt audit.table_list;
INSERT INTO @Modifieduddt(table_name) values('aaa');
return @modifiedUddt
end

这是只插入一行/记录并替换以前的值。当我试图将函数中的参数作为表而不是varchar(50(传递时,它不允许我返回引用UDDT的参数。我正试图在UDDT中的列中插入多个值。我的目标是将table_name作为列传递,但当我这样做时,我无法在函数中返回@name

您传入一个表,UDF中的SELECT返回一个结果集,然后尝试将其分配给@name,即NVARCHAR(255(,UDF返回一个NVARCHAR(255(结果。换句话说,您试图将一个结果集分配给一个NVARCHAR(255(变量,但该变量不起作用。

如果您想返回所有结果,那么您的函数应该返回一个表,而不是NVARCHAR(255(。

--Returns all values from @list
CREATE OR ALTER FUNCTION [dbo].[test1] (@list audit.table_list readonly) 
returns TABLE
as
RETURN (SELECT table_name FROM @list)
--Use the UDF
SELECT * FROM [dbo].[test1];

如果您只想从UDF中得到一个结果,那么将返回类型保留为NVARCHAR(255(,并修改查询以添加WHERE子句、TOP或将产生一个可存储在NVARCHAR(255(变量中的值的内容。

--Returns a single NVARCHAR(255) value from @list
CREATE OR ALTER FUNCTION [dbo].[test1] (@list audit.table_list readonly) 
returns nvarchar(255) 

as
Begin
DECLARE @name varchar(50)
select TOP 1 @name = table_name from @list
return @name
end
--Use the UDF
SELECT [dbo].[test1];

请注意两者在函数调用方式上的差异。第一个使UDF成为表值函数(TVF(,第二个使函数成为标量值函数(SVF(。对于TVF,您可以像使用表一样使用函数(基本上还有其他考虑因素(,对于TVF则将函数用作标量值。

最新更新