嗨,我是sql初学者。我在(UDF)函数标量中有问题
Posted
技术标签:
【中文标题】嗨,我是sql初学者。我在(UDF)函数标量中有问题【英文标题】:Hi, I'm a beginner in sql. I have problem in (UDF) function scalar 【发布时间】:2020-10-03 16:06:35 【问题描述】:我的功能是:
Create Function [dbo].[FindMaxRadif](@field nvarchar(15), @tbl nvarchar(15))
returns int
as
begin
declare @query int
set @query = 'select max('+ @field+') from '+ @tbl
return (@query)
end
当使用此命令执行此功能时:
select dbo.FindMaxRadif('IdVehicle','TblVehicle')
我收到此错误:
转换 nvarchar 值 'select 时转换失败 max(IdVehicle) 从 TblVehicle' 到数据类型 int。
如何解决?
【问题讨论】:
您尝试使用动态 SQL,但您不能在 UDF 中使用动态 SQL(您可以在存储过程中使用) @dnoeth - 再看一遍...... OP 没有尝试在函数中执行动态 SQL。他只是试图将部分连接成一个字符串,可以在函数之外用作动态 SQL。 @JeffModen 好吧,OP 尝试将字符串分配给 INT 结果,这就是它失败并出现类型转换错误的原因。 @dnoeth - 是的......同意。这是唯一的问题......不是你说的动态 SQL。 @JeffModen 当然是动态SQL,他尝试在查询字符串中分配计数的result。 【参考方案1】:用户定义的函数中不允许使用动态 SQL。他们不允许进行数据更改,并且禁止动态 SQL 有助于强制执行。您可以改用存储过程,将数据作为结果集返回:
create or alter procedure [dbo].[FindMaxRadif] @field nvarchar(15), @tbl nvarchar(15)
as
/*
create table a(i int)
insert into a(i) values (1),(2);
exec FindMaxRadif 'i','a'
*/
begin
declare @query nvarchar(max);
set @query = concat('select max(', quotename(@field), ') from ', quotename(@tbl));
--print @query
exec(@query);
end
或输出参数
create or alter procedure [dbo].[FindMaxRadif2] @field nvarchar(15), @tbl nvarchar(15), @rv int output
as
/*
create table a(i int)
insert into a(i) values (1),(2);
declare @v int
exec FindMaxRadif2 'i','a', @v out
select @v
*/
begin
declare @query nvarchar(max);
set @query = concat('select @rv = max(', quotename(@field), ') from ', quotename(@tbl));
--print @query
exec sp_executesql @query, N'@rv int output', @rv = @rv output
end
【讨论】:
OP 没有尝试在函数中执行动态 SQL。他只是试图创建动态 SQL,就像任何其他连接一样。以上是关于嗨,我是sql初学者。我在(UDF)函数标量中有问题的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2008 R2 - 标量 UDF 导致无限循环