/*
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.   

    再次非常感谢一剑飘香大哥的鼎力相助.不过小弟试了你的code后有以下疑问:
    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.   

    (1)、不管其它的,但Execute在Function內部是不能返回結果集的。這一點,我試過很多次,曾經也被迫采用其它的一些變通方法。
    (2)、比較奇怪,我在寫程式的時候,沒有遇到過此類需求,所以也沒有去使用。但我昨天只是隨手寫了几行,發現它可以Run,所以就給你了。具體的情況正在Try.....
      

  3.   

    第二點,按Books Online上的說法是不可以傳Cursor及table進Function內部的,但實行上可傳 cursor,但不能傳table.但在Call Function時又會提示說 Invalid columns....,奇怪奇怪…
      

  4.   

    1.在用户自定义函数内部只能使用EXECUTE 语句调用扩展存储过程而不是用来执行SQL语句
    2.根据SQL2000的文档:
    参数的数据类型。所有标量数据类型(包括 bigint 和 sql_variant)都可用作用户定义函数的参数。不支持 timestamp 数据类型和用户定义数据类型。不能指定非标量类型(例如 cursor 和 table)。
      

  5.   

    1.既然可以使用EXECUTE 语句调用扩展存储过程,你就可以使用sp_executesql来执行SQL语句
    2.既然不能传递cursor类型的参数,你是否可以考虑使用临时表?
      

  6.   

    谢谢大哥们的帮忙.
    1. 如果在function中再用execute中去执行另一个stored proecedure, 那么这个
    function的通用性优势就会受影响, 既然没有通用性优势, 我还不如直接写一个
    stored procedure, 以免麻烦和影响性能.
    2. 如果可以传一个cursor进function, 我就可以做一个通用的function.