天天看點

把存儲過程結果集SELECT INTO到臨時表

在開發過程中,很多時候要把結果集存放到臨時表中,常用的方法有兩種。

一. SELECT INTO 

1. 使用select into會自動生成臨時表,不需要事先建立

2. 如果目前會話中,已存在同名的臨時表

再次運作,則會報錯提示:資料庫中已存在名為 '%1!' 的對象。

Msg 2714, Level 16, State 6, Line 2

There is already an object named '#temp' in the database.

在使用select into前,可以先做一下判斷:

3. 利用select into生成一個空表

如果要生成一個空的表結構,不包含任何資料,可以給定一個恒不等式如下:

二. INSERT INTO

1. 使用insert into,需要先手動建立臨時表

1.1 儲存從select語句中傳回的結果集

1.2 儲存從存儲過程傳回的結果集

<a></a>

1.3 儲存從動态語句傳回的結果集

對于動态SQL,或者類似DBCC這種非正常的SQL語句,都可以通過這種方式來儲存結果集。

2. 不能嵌套使用insert exec語句

2.1 下面這個例子,嘗試儲存sp_help_job的結果集到臨時表,發生錯誤

傳回錯誤資訊:INSERT EXEC 語句不能嵌套。

Msg 8164, Level 16, State 1, Procedure sp_get_composite_job_info, Line 72

An INSERT EXEC statement cannot be nested.

展開錯誤資訊中的存儲過程:

發現裡面還有個INSERT INTO…EXEC的嵌套調用,SQL Server在文法上不支援。

2.2 可以用分布式查詢來避免這個問題,這種寫法在INSIDE SQL Server 2005中作者提到過

(1) 首先到打開伺服器選項Ad Hoc Distributed Queries

(2) 通過OPENROWSET連接配接到本機,運作存儲過程,取得結果集

使用windows認證

使用SQL Server認證

這樣的寫法,既免去了手動建表的麻煩,也可以避免insert exec 無法嵌套的問題。幾乎所有SQL語句都可以使用。

<a>本文轉自左正部落格園部落格,原文連結http://www.cnblogs.com/soundcode/p/3544586.html,如需轉載請自行聯系原作者</a>