2012-03-16 38 views
0

我在寫一個將表名作爲參數的函數。 我知道我需要的表名,但表名+表所有者是動態傳入的(我需要這樣做,但目前不工作)。如何從函數運行查詢時,表名作爲參數傳遞

它看起來是這樣的:

CREATE FUNCTION [myowner]. 
[alex_diff](@fromdate datetime, @todate datetime, @table_name varchar(256), @country_code varchar(3)) 
RETURNS int 
AS 
BEGIN 
... 
set @date_string = (select calendar_month2 from ??? where [email protected]_year and country_code = @country_code) 
... 
END 

我不能把@table_name到位的 '???' 這給了我錯誤:

Msg 1087, Level 16, State 1, Procedure alex_business_date_diff, Line 53 Must declare the table variable "@table_name".

我能做些什麼對動態傳遞表名執行SQL?

我曾嘗試做如下:

set @statement = 'select @output=' + @column_name + ' from ' + @table_name + ' where calendar_year=' + cast(@current_year as varchar(4)) + ' and country_code = ' + @country_code; 
    EXEC sp_executesql @statement, N'@output varchar(31) OUTPUT', @date_string OUTPUT 

但得到這個錯誤(當我嘗試運行功能):

Msg 557, Level 16, State 2, Line 1 Only functions and some extended stored procedures can be executed from within a function.

+1

你不能在一個函數執行動態SQL,所以這實在是一個存儲過程 – Lamak 2012-03-16 18:59:07

+0

如果您的功能必須支持表的列表是有限的,而不是太大,你可以嘗試使用了一系列簡單明瞭的IF &ELSEs。 – 2012-03-17 14:50:40

回答

1

你可以在SQL Server中使用CLR和利用將運行動態SQL的.NET語言。

1

您可以創建一個包含所有動態操作的存儲過程,並通過輸出參數使用結果。

相關問題