2015-02-12 30 views
-2

我已經使用臨時表加上臨時變量.. 現在,當我的sql查詢同時具有臨時變量和表時,我知道sp_executesql不工作,因爲我們不能在其中使用臨時表 並且標準執行不會採用可變參數。 因此,如果任何人都可以幫助我解決這個問題,那將會非常有用嗎?如何在sql查詢中使用參數(sp_executesql不按照需求工作)

這是一個示例代碼:

create procedure tryit 
as begin 
declare @temp as Table_Type; 

declare @ghdhj as nvarchar(50) 
set @ghdhj='TBVHTempSelectionTable'; 

declare @sqlstatement nvarchar(max); 
set @sqlstatement=N'insert into @temp select * from '[email protected]+';'; 
exec sp_executesql @sqlstatement; 
--,@temp='finalResultTable',@ghdhj='TBVHTempSelectionTable' 

select * from @temp; 
end 
go 

exec tryit 
+3

我們展示的代碼的sql語句內聲明的任何變量。 – 2015-02-12 05:26:44

+0

我附上了一個示例代碼。 – Sarthak 2015-02-12 06:14:28

+0

您可以將過程分爲兩部分 - 您可以輕鬆地將只讀表變量傳遞給'sp_executesql'和任何存儲過程。因此,如果您在'sp_executesql'內聲明表變量,則可以輕鬆地調用結果中的任何存儲過程。 – Luaan 2015-02-12 08:15:24

回答

1

創建臨時表,然後執行sp_executesql

+2

考慮更多地解釋這個答案,並且可能添加示例代碼以使其非常清楚。 – 2015-02-12 06:12:57

+0

我已經試過了,這就是爲什麼問這個問題。你可以看到示例代碼。這不起作用。 – Sarthak 2015-02-12 06:15:40

+0

@Sarthak這不是一個臨時表,這是一個表變量。 – Luaan 2015-02-12 08:01:25

1

如果創建臨時表首先你應該能夠訪問它在sp_executesql的,如果你明確的指定

select * 
into #peter 
from (values (10), (10)) p(a); 

exec sp_executesql N'insert into tempdb..#peter values (20), (20)'; 

select * from #peter; 
-- Result 
A 
10 
10 
20 
20 
1

sp_executesql可以接受表值參數,因此您可以將表變量傳遞給sp_executesql。

首先,您需要在數據庫中定義的表類型。您使用CREATE TYPE語句創建表類型。例如:

CREATE TYPE dbo.CategoryTableType AS TABLE 
( 
    CategoryID int, 
    CategoryName nvarchar(50) 
) 

GO 

一旦擁有表類型,就可以將該類型的表變量傳遞給sp_executesql。例如:

DECLARE @Categories CategoryTableType 
INSERT INTO @Categories 
VALUES (1, 'Beverages'), (2, 'Confections') 

EXEC dbo.sp_executesql 
    N'SELECT * FROM @Categories', 
    N'@Categories CategoryTableType READONLY', 
    @Categories 

sp_executesql的無法訪問傳遞給sp_executesql的SQL語句外聲明的任何類型的變量。

但是,sp_executesql可以訪問在調用作用域堆棧中創建的臨時表。例如:

CREATE TABLE #Categories ( 
    CategoryID int, 
    CategoryName nvarchar(50) 
) 
INSERT INTO #Categories VALUES 
(1, 'Beverages'), (2, 'Confections') 


EXEC dbo.sp_executesql N'SELECT * FROM #Categories' 

DROP TABLE #Categories 

另一方面,調用範圍無法訪問在傳遞給sp_executesql的sql語句中創建的臨時表。例如,以下代碼將失敗,消息208,級別16,狀態0,無效的對象名稱「#Categories」。

EXEC dbo.sp_executesql N' 
    CREATE TABLE #Categories ( 
     CategoryID int, 
     CategoryName nvarchar(50) 
    ) 
    INSERT INTO #Categories VALUES 
    (1, ''Beverages''), (2, ''Confections'')' 

SELECT * FROM #Categories 

此外,呼叫範圍無法訪問傳遞給sp_executesql的