嗨,我是sql的初学者我在UDF函数标量中遇到问题

问题描述

我的功能是:

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时转换失败 TblVehicle'中的max(IdVehicle)到数据类型为int。

如何解决

解决方法

用户定义的函数中不允许使用动态SQL。不允许他们进行数据更改,并且禁止使用动态SQL可以强制执行更改。您可以改用存储过程,将数据作为结果集返回:

$ date --date "2020-10-03T17:49:23" "+%Y-%m-%dT%H:%M:%S"
2020-10-03T17:49:23
$ date --date "2020-10-03T17:49:23 + 1 second" "+%Y-%m-%dT%H:%M:%S"
2020-10-03T17:49:24
$ date --date "2020-10-03T17:49:23 + 2 second" "+%Y-%m-%dT%H:%M:%S"
2020-10-03T16:49:24
$ date --date "2020-10-03T17:49:23 + 2 seconds" "+%Y-%m-%dT%H:%M:%S"
2020-10-03T16:49:24
$ date --date "2020-10-03T17:49:23 - 2 seconds" "+%Y-%m-%dT%H:%M:%S"
2020-10-03T20:49:24

或输出参数

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