问题描述
我的功能是:
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