/*
Sorry,上次給你的回覆有點錯誤。
SQL 2000的Function內部,Execute是不能返回結果集的。所以就別動心思了。但還是可是使用Execute語句。總而言之,SQL Server 2000的自定義 Function,寫起來很多的限制。具體你可以查Books online.
*/Create Function RetTable (@strCommand varchar(300))
Returns @tmpTable Table (PartCode varchar(30) Primary key , PartRule varchar(200))AS/*這個Function沒什麼作用,只是讓你明白Execute的用法*/
BEGIN
Execute @strCommand /* 這樣不會有錯,只是不能這樣: INSERT INTO tableName Execute (@strCommand) , 即不能產生結果集*/
insert into @tmptable select Partcode,partrule from tblstock
return
END/*至於第二個問題就簡單一點,你可是直接傳一 個Cursor進入Function,如下*/Create Function CursorTest(@Test Cursor )
Returns INT /*返回類型你自己定義*/
AS BEGIN
DECLARE @strPartCode varchar(30),@strPartRule varchar(200)
FETCH NEXT From @Test INTO @strPartCode,@strPartRule
WHILE @@Fetch_status=0
BEGIN
--這里可以根據需求寫上一些處理語句
FETCH NEXT From @Test INTO @strPartCode,@strPartRule
END
RETURN (1)
END
Sorry,上次給你的回覆有點錯誤。
SQL 2000的Function內部,Execute是不能返回結果集的。所以就別動心思了。但還是可是使用Execute語句。總而言之,SQL Server 2000的自定義 Function,寫起來很多的限制。具體你可以查Books online.
*/Create Function RetTable (@strCommand varchar(300))
Returns @tmpTable Table (PartCode varchar(30) Primary key , PartRule varchar(200))AS/*這個Function沒什麼作用,只是讓你明白Execute的用法*/
BEGIN
Execute @strCommand /* 這樣不會有錯,只是不能這樣: INSERT INTO tableName Execute (@strCommand) , 即不能產生結果集*/
insert into @tmptable select Partcode,partrule from tblstock
return
END/*至於第二個問題就簡單一點,你可是直接傳一 個Cursor進入Function,如下*/Create Function CursorTest(@Test Cursor )
Returns INT /*返回類型你自己定義*/
AS BEGIN
DECLARE @strPartCode varchar(30),@strPartRule varchar(200)
FETCH NEXT From @Test INTO @strPartCode,@strPartRule
WHILE @@Fetch_status=0
BEGIN
--這里可以根據需求寫上一些處理語句
FETCH NEXT From @Test INTO @strPartCode,@strPartRule
END
RETURN (1)
END
1. 在function内用Execute @strCommand是可以的, 但是用Execute (@strCommand)确是
错误的. Execute @strCommand和Execute (@strCommand)有很大的区别.Look.
Execute a stored procedure:
[ [ EXEC [ UTE ] ]
{
[ @return_status = ]
{ procedure_name [ ;number ] | @procedure_name_var
}
[ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ]
[ ,...n ]
[ WITH RECOMPILE ] Execute a character string:
EXEC [ UTE ] ( { @string_variable | [ N ] 'tsql_string' } [ + ...n ] ) 2. 你的第二个function可以成功的create一个user-defined function, 但我不知道在
外面如何调用这个function,即如何传cursor进这个function, 小弟是这样做的, 但是不
对.Look.
declare cur cursor for select name, age from person
open cur
CursorTest(cur)
close cur
deallocate cur
能给小弟一个sample吗, 谢谢!
(2)、比較奇怪,我在寫程式的時候,沒有遇到過此類需求,所以也沒有去使用。但我昨天只是隨手寫了几行,發現它可以Run,所以就給你了。具體的情況正在Try.....
2.根据SQL2000的文档:
参数的数据类型。所有标量数据类型(包括 bigint 和 sql_variant)都可用作用户定义函数的参数。不支持 timestamp 数据类型和用户定义数据类型。不能指定非标量类型(例如 cursor 和 table)。
2.既然不能传递cursor类型的参数,你是否可以考虑使用临时表?
1. 如果在function中再用execute中去执行另一个stored proecedure, 那么这个
function的通用性优势就会受影响, 既然没有通用性优势, 我还不如直接写一个
stored procedure, 以免麻烦和影响性能.
2. 如果可以传一个cursor进function, 我就可以做一个通用的function.