2013-11-27 62 views
0

有沒有辦法在一個字符串發送到T-SQL的功能和使用字符串作爲「表」發送串入功能和使用字符串作爲「表」

例如

CREATE FUNCTION [dbo].[TEST] (@id int, **@table_name** nvarchar(50)) 
RETURNS @mytables TABLE 
    (
    id  int, 
    values nvarchar(50) 
    ) 
AS 
BEGIN 
    INSERT @mytables 
     SELECT id, values FROM **@table_name** 
    RETURN 
END 
+0

沒有該SP,你不能直接這樣做 - 如果你需要參數化的表和/或列名,則必須求助於使用*動態SQL * - 沒有其他辦法可以做到它 –

+0

我的意思是,我可以在這個函數內使用另一個函數,或者不管它是什麼。我只想知道它是否可以完成以及如何:) – Joe

+0

Plus:SQL Server **中的**函數**不能**對數據庫有任何副作用,例如:你**不能**插入,更新或刪除函數內的數據行。請參閱[CREATE FUNCTION - 「限制和限制」一節](http://msdn.microsoft.com/zh-cn/library/ms186755.aspx):*用戶定義的函數不能用於執行修改數據庫狀態的操作。* –

回答

1

你不能使用動態SQL函數,也不能插入,更新或刪除用戶自定義函數中的任何表(請檢查這個link由Marc給出),對於你的要求,SP是這樣最好的解決方案:

CREATE PROCEDURE [dbo].[TEST] (@id int, @table_name nvarchar(50)) 
AS 
BEGIN 
    declare @strSQL NVARCHAR(MAX) 

    set @strSQL = ' SELECT ' + cast(@id as varchar(20)) + ', Name from ' + @table_name 
    exec(@strSQL) 
END 

,且由

EXEC [TEST] @id=5, @table_name='tablename' 
+0

我想這是唯一的方法。唯一的問題是str只能是4000 char,我需要它更大。 謝謝反正! – Joe

+1

你在哪裏遇到4000個字符的問題?在字符串中,你只需傳遞表名,對吧? –

+0

這只是一個例子。我想創建一個比這更大:) BTW我可以跳過聲明@strSQL,只是直接在存儲過程中的SELECT? – Joe

相關問題