永发信息网

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

答案:2  悬赏:80  手机版
解决时间 2021-02-03 12:36
  • 提问者网友:记得曾经
  • 2021-02-02 19:35
sqlserver中的用户定义函数不能使用不确定函数,exec就是一个不确定函数。网上有人说改成存储过程,但是我需要在sql语句中使用函数返回的值。请问有什么办法没有?谢谢了
最佳答案
  • 五星知识达人网友:詩光轨車
  • 2021-02-02 20:07
这里我举个例子,假如有一个函数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等函数中不能使用的内容。

这个解释你明白了吗?
全部回答
  • 1楼网友:往事隔山水
  • 2021-02-02 20:30
在某些情况下,作用是一样的,如: 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)
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯