2012-10-24 43 views
2

我有一個存儲過程,我創建一個表變量,然後嘗試對該表變量執行select,但輸出引發不正確的語法錯誤。使用表變量從SQL Server的select語句不正確的語法錯誤

下面我有我的存儲過程(簡體):

CREATE PROCEDURE [dbo].[spGetLog] 
AS 
    SET NOCOUNT ON; 

    Declare @Table table (ID int identity(1,1), 
         Node varchar(100) 
         ) 

    insert into @Table(Node) values ('employee') 

    Declare @sqlquery AS NVARCHAR(1000) 

    SET @sqlquery = 'select * from @Table;' 
    EXEC (@sqlquery) 

給出了一個錯誤 -

附近有語法錯誤@Table「

在現實中, @sqlquery變量我有複雜的,我需要使用一個變量和 執行曲紅黴素。

有沒有辦法仍然可以使用變量執行我的存儲過程?歡迎任何其他 建議。

+2

不會要求這是絕對正確的,所以Declare @TableName語法用於table * variables *,而不是臨時表,並且我認爲在EXEC發生時'@ Table'變量超出了範圍。 –

+0

@David W謝謝!我改變了標題。是的,正如你所說,它似乎超出了範圍。你有任何建議或解決此問題的方法 – CodeNinja

+0

你可以使用臨時表語法來聲明表,那麼你應該能夠執行你是XEC。當程序退出時,只需刪除臨時表。 –

回答

0

由於David W在他的評論中提到的,只需使用一個臨時表(不表變量),如果你想要的東西,那就是你的EXEC範圍內可見:

CREATE TABLE #Table (ID int identity(1,1), 
        Node varchar(100) 
        ) 
insert into #Table(Node) values ('employee') 

Declare @sqlquery AS NVARCHAR(1000) 

SET @sqlquery = 'select * from #Table;' 
EXEC (@sqlquery) 

DROP TABLE #Table; 
+0

比你大衛W和尼克瓊斯。我的第一篇文章在stackoverflow。 這工程! 對於其他人有相同的問題,你可以參考下面的鏈接 http:/ /表變量只存在於與變量相同的作用域中,與臨時表相反,它們在內部存儲過程中不可見,並且在內部存儲過程中不可見exec(string)語句,而且它們不能用於insert/exec語句。 – CodeNinja