2010-11-23 23 views
22

我想傳遞一個表變量sp_executesql過程:傳遞一個表變量sp_executesql的

DECLARE @params NVARCHAR(MAX) 
SET @params = '@workingData TABLE (col1 VARCHAR(20), 
       col2 VARCHAR(50))' 

EXEC sp_executesql @sql, @params, @workingData 

我得到的錯誤:

Msg 156, Level 15, State 1, Line 1 
Incorrect syntax near the keyword 'TABLE'. 

我試着忽略之後「列規範表'。我還試圖將該表聲明爲動態SQL內的變量。但沒有運氣......

似乎我認爲TABLE變量不允許作爲參數在這個過程中傳遞?順便說一句:我正在運行MSSQL2008 R2。

我不感興趣,在使用本地臨時表像#workingData因爲我從另一個程序加載的工作數據:

INSERT INTO @workingData 
    EXEC myProc @param1, @param2 

,我不能做直接到一個臨時varaible(?右).. 。

任何幫助讚賞!

+0

@workingdata變量的內容是什麼? – NotMe 2010-11-23 17:23:39

+0

所有變量的內容是什麼?我不認爲這是在做你所期望的。 – Donnie 2010-11-23 17:38:17

+0

我使用@workingData TABLE存儲來自另一個過程的結果,該過程返回幾個過程使用的一般結果集。這是爲了減少多餘的代碼:INSERT INTO @workingData EXEC someProc – Alex 2010-11-24 07:52:39

回答

3

OK,這將讓我我想要的,但肯定是不漂亮:

DECLARE @workingData TABLE (col1 VARCHAR(20), 
     col2 VARCHAR(20)) 

    INSERT INTO @workingData 
     EXEC myProc 

    /* Unfortunately table variables are outside scope 
     for the dynamic SQL later run. We copy the 
     table to a temp table. 
     The table variable is needed to extract data directly 
     from the strored procedure call above... 
    */ 
    SELECT * 
    INTO #workingData 
    FROM @workingData 


     DECLARE @sql NVARCHAR(MAX) 
    SET @sql = 'SELECT * FROM #workingData' 

    EXEC sp_executesql @sql 

必須有一個更好的辦法來這個臨時結果集傳遞到sp_executesql的!?

問候 亞歷

11

如果您使用的是SQL Server 2008中,爲表變量傳遞給一個存儲過程,你必須首先定義表類型,如:

CREATE TYPE SalesHistoryTableType AS TABLE 
(      
    [Product] [varchar](10) NULL,     
    [SaleDate] [datetime] NULL,     
    [SalePrice] [money] NULL 
) 
GO 

或使用現有的表類型存儲在數據庫中。

使用該查詢以定位現有的表類型

SELECT * FROM sys.table_types 

要在存儲的過程中使用,聲明一個輸入變量是表:

CREATE PROCEDURE usp_myproc 
(
    @TableVariable SalesHistoryTableType READONLY 
) 
AS BEGIN 
    --Do stuff  

END 
GO 

傳遞到前填充表變量存儲過程:

DECLARE @DataTable AS SalesHistoryTableType 
INSERT INTO @DataTable 
SELECT * FROM (Some data) 

調用存儲過程:

EXECUTE usp_myproc 
@TableVariable = @DataTable 

進一步討論here

2

雖然這可能不會直接回答您的問題,但它應該可以解決您的問題。

您確實可以捕獲存儲過程執行的結果到一個臨時表:

INSERT INTO #workingData 
EXEC myProc 

因此改變你的代碼如下所示:

CREATE TABLE #workingData (col1 VARCHAR(20),  
    col2 VARCHAR(20))  

INSERT INTO #workingData  
    EXEC myProc  

DECLARE @sql NVARCHAR(MAX)  
SET @sql = 'SELECT * FROM #workingData'  

EXEC sp_executesql @sql  

問候, 添

0
Alter PROCEDURE sp_table_getcount 
@tblname nvarchar(50) , 
@totalrow int output 
AS 
BEGIN 

Declare @params nvarchar(1000) 
Declare @sql nvarchar(1000) 
set @sql = N'Select @cnt= count(*) From @tbl' 
set @params = N'@tbl nvarchar(50) , @cnt int OUTPUT' 
Exec sp_executesql @sql , @params ,@[email protected] , @cnt = @totalrow OUTPUT 
END 
GO 

請注意,上面的代碼不會作爲表作爲一個對象超出了範圍。它會給你錯誤:必須聲明表變量。爲了解決這個問題,我們可以做下面的事情。

Alter PROCEDURE sp_table_getcount 
@tblname nvarchar(50) , 
@totalrow int output 
AS 
BEGIN 

Declare @params nvarchar(1000) 
Declare @sql nvarchar(1000) 
set @sql = N'Select @cnt= count(*) From dbo.' + @tblname 
set @params = N'@cnt int OUTPUT' 
Exec sp_executesql @sql , @params , @cnt = @totalrow OUTPUT 
END 
GO