Ⅰ sqlserver中如何在用戶定義的函數里使用exec
這里我舉個例子,假如有一個函數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 Procere dbo.NumAdd1
GO
CREATE Procere 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 Procere dbo.NumAdd2
GO
CREATE Procere 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等函數中不能使用的內容。
這個解釋你明白了嗎?
Ⅱ 執行動態SQL語句的函數怎麼寫
執行動態SQL語句的函數怎麼寫
其實你這你都知道用函數實現不了的,因為你的輸入參數@SQL是動態的,那必須用exec執行,而函數里不能用exec。建議你用存儲過程實現,示例如下:
創建存儲過程:
create procere TEST
(
@SQL NVARCHAR(200),
@RE INT output
)
AS
BEGIN
set nocount on
if exists (select * from tempdb.dbo.sysobjects where xtype='U' and id=object_id('#test'))
drop table #test
create table #test(total int)
insert into #test
exec (@SQL)
select @RE=isnull(total,0) from #test
set nocount off
END
調用示例:
declare @RE int
exec TEST 'select 1+1',@RE output
PRINT @RE
結果:
2
Ⅲ sql 中exec 的含義和用法
執行意思,如果你創建了一個存儲過程名為Demo,而且裡面就是簡單查詢
create
proc
Demo
as
select
*
from
表名
執行上面語句,然後就創建了Demo
如果你想執行Demo,就用exec
Demo
就直接執行了select語句,相當於編程語言中的調用函數