none
自訂函數裏的select table名稱可否為變數? RRS feed

  • 問題

  • 我們系統有一些table是依年度產生的(例 Mtable951,Mtable952)

    後面三個字是變動的,除了用預存程序以外,函數是否也可以傳回我要的table

    我試著寫了一個可以回傳table的function

    但是語法裏的table不能用變數來代替...不知道有何解決方法

     

     

    Code Snippet

    ALTER FUNCTION [dbo].[V_GettableXXX]
    (
    @T_tablename varchar(15)  ,
    @T_year varchar(4)
    )
    RETURNS table
    AS
    BEGIN
      DECLARE @tableXXX varchar(25)
     set @tableXXX=@T_tablename+@T_year
     select * from @tableXXX 
    END

     

    2007年5月14日 上午 08:19

解答

  • 那可能就沒辦法了 ...

     

    (以下取自 SQL Server 2005 Books Online)

    函數中有效的陳述式類型包括:

    • DECLARE 陳述式,可用來定義對函數而言為本機的資料變數與資料指標。
    • 指派值給對函數而言為本機的物件,例如使用 SET 指派值給純量及資料表本機變數。
    • 參考在函數中宣告、開啟、關閉及取消配置的本機資料指標之資料指標運算。不允許將資料傳回用戶端的 FETCH 陳述式。只允許使用 INTO 子句指派值給本機變數的 FETCH 陳述式。
    • 除了 TRY...CATCH 陳述式以外的流程控制陳述式。
    • 含有選取清單及指派值給對函數而言為本機變數之運算式的 SELECT 陳述式。
    • 修改對函數而言為本機之資料表變數的 UPDATE、INSERT 及 DELETE 陳述式。
    • 呼叫擴充預存程序的 EXECUTE 陳述式。
    2007年5月14日 上午 09:17
    版主

所有回覆

  • 請使用 EXEC 'sql_statement' 來執行 SQL 指令。

     

    Code Snippet
    ALTER FUNCTION [dbo].[V_GettableXXX]
    (
      @T_tablename varchar(15)  ,
      @T_year varchar(4)
    )
    RETURNS table
    AS
    BEGIN
      DECLARE @tableXXX varchar(25)
      set @tableXXX=@T_tablename+@T_year
      EXEC 'select * from ' + @tableXXX 
    END

     

     

    2007年5月14日 上午 08:26
    版主
  • 好像不能使用exec

    我有試..語法檢查就出錯了

    2007年5月14日 上午 08:40
  • 那可能就沒辦法了 ...

     

    (以下取自 SQL Server 2005 Books Online)

    函數中有效的陳述式類型包括:

    • DECLARE 陳述式,可用來定義對函數而言為本機的資料變數與資料指標。
    • 指派值給對函數而言為本機的物件,例如使用 SET 指派值給純量及資料表本機變數。
    • 參考在函數中宣告、開啟、關閉及取消配置的本機資料指標之資料指標運算。不允許將資料傳回用戶端的 FETCH 陳述式。只允許使用 INTO 子句指派值給本機變數的 FETCH 陳述式。
    • 除了 TRY...CATCH 陳述式以外的流程控制陳述式。
    • 含有選取清單及指派值給對函數而言為本機變數之運算式的 SELECT 陳述式。
    • 修改對函數而言為本機之資料表變數的 UPDATE、INSERT 及 DELETE 陳述式。
    • 呼叫擴充預存程序的 EXECUTE 陳述式。
    2007年5月14日 上午 09:17
    版主
  • 好像也不能呼叫預存程式..

    我再試試..很感謝您的回答

     

     我先寫一個預存程式,再去函數裏呼叫..好像也不行....

    Code Snippet

    -- =============================================
    -- Description: <Description, 取得要用的年度table,>
    -- =============================================
    ALTER FUNCTION [dbo].[V_GettableXXX]
    (
    @T_tablename varchar(15)  ,
    @T_year varchar(4)
    )
    RETURNS table
    AS
    return
    (
     get_tableXXX @T_tablename,@T_year
     )
    go

     

    2007年5月14日 上午 09:47
  • 函數內的 EXECUTE 只能呼叫 "擴充" 預存程序(和一般預存程序不同)。
    2007年5月14日 上午 10:33
    版主