永发信息网

sqlserver中如何在用户定义的函数里使用exec?

答案:2  悬赏:80  手机版
解决时间 2021-02-03 12:36
sqlserver中的用户定义函数不能使用不确定函数,exec就是一个不确定函数。网上有人说改成存储过程,但是我需要在sql语句中使用函数返回的值。请问有什么办法没有?谢谢了
最佳答案
这里我举个例子,假如有一个函数dbo.NumAdd用来计算加法,那它可能是这样的:
DROp FUNCTION dbo.NumAdd
GO
CREATE FUNCTION dbo.NumAdd
( @A SMALLINT,
@B SMALLINT
)
RETURNS INT
AS
BEGIN
DECLARE @Ret INT
SET @Ret = ISNULL(@A,0) + ISNULL(@B,0)
RETURN @Ret
END

你可以使用这样的方式调用函数并得到返回值:
DECLARE @M INT
SET @M = dbo.NumAdd(500,700)
select @M

现在,把这个函数修改成第一种使用存储过程的方式:
DROP Procedure dbo.NumAdd1
GO
CREATE Procedure dbo.NumAdd1
( @A SMALLINT,
@B SMALLINT,
@Ret INT OUTPUT
)
AS
BEGIN
SET @Ret = ISNULL(@A,0) + ISNULL(@B,0)
END
GO

那么,你就可以通过下列的方法调用这个实际和函数dbo.NumAdd功能相同的存储过程:
DECLARE @M1 INT
EXEC dbo.NumAdd1 500,600,@M1 OUTPUT
SELECT @M1

这种方法是对标量函数较好的处理方法,而且,一个存储过程可以使用一个或者多个带有OUTPUT的参数来返回值。

再看第二种方法修改为存储过程的方式:
DROP Procedure dbo.NumAdd2
GO
CREATE Procedure dbo.NumAdd2
( @A SMALLINT,
@B SMALLINT
)
AS
BEGIN
DECLARE @Ret INT
SET @Ret = ISNULL(@A,0) + ISNULL(@B,0)
SELECT @Ret
END
GO

这样,你就可以使用下面的方法来调用:

DECLARE @M2 INT
CREATE TABLE #Temp (Result INT)
INSERT #Temp EXEC dbo.NumAdd2 800,600
SELECT TOP 1 @M2 = Result FROM #Temp
DROP TABLE #Temp
SELECT @M2

列出的这两种方法都是把函数改成存储过程的方法,而且在存储过程中可以使用EXEC、PRINT等函数中不能使用的内容。

这个解释你明白了吗?
全部回答
在某些情况下,作用是一样的,如: use db; go --create the table. we'll pull info from here for our dynamic sql create table dynamicsqlexample ( tableid int identity not null constraint pkdynamicsqlexample primary key, schemaname varchar(128) not null, tablename varchar(128) not null ); go insert into dynamicsqlexample select s.name as schemaname, t.name as tablename from sys.schemas s join sys.tables t on s.schema_id = t.schema_id; go declare @schemaname varchar(128) declare @tablename varchar(128) -- now, grab the table name that goes with our id select @schemaname = schemaname, @tablename = tablename from dynamicsqlexample where tableid = 3 -- finally, pass that value into the exec statement exec ('select * from ' + @schemaname + '.' + @tablename)
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
北京世纪宝宝教育机构朝阳旗舰店我想知道这个
害事的意思是什么啊?知道的请说下!
七龙珠火还是圣斗士星矢火
13车02C是什么意思啊,是高铁动车还是火车呢
阅读下边漫画,回答下列问题:(1)请你提醒
1960年三罗马五元整刀人民币现在值多少钱?
韶山文艺馆在哪里啊,我有事要去这个地方
莲宇的意思是什么啊?知道的请说下!
云集微店怎么申请售后
我和草原有个约定歌词意义
含氧酸起氧化作用,无氧酸则不能.失电子难的院
奥康跆拳道地址在哪,我要去那里办事
上海钢铁金融产业园我想知道这个在什么地方
师船的意思是什么啊?知道的请说下!
对正常月经的临床表现的描述,不正确的是A.出
推荐资讯
盟鸥的意思是什么啊?知道的请说下!
你好 若是诺邓火腿厂有商标有执照 国家认证是
绥和园香嘴鸭地址在哪,我要去那里办事
摩顶至足的意思是什么啊?知道的请说下!
新凯肉食地址有知道的么?有点事想过去
给一个三个月大的猫五根火腿能吃三天吗
银行保证金存款是什么?
有没有最简单的方法知道孩子是不是自已生的
临翔区农机安全监理站在哪里啊,我有事要去这
猪喂泔水的加什么料子好
廉正的意思是什么啊?知道的请说下!
本次龙之谷新版装备体系变更对95级以上所有的
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?