實現將儲存過程作為inser into的資料來源,插入臨時表
1、引言
今天專案製作報表需要實現一個功能,將執行一個儲存過程後的資料表,作為資料來源,插入到一張臨時表裡。由於這個臨時表知識系統自動生成的字串,並沒有在資料庫(SQL Server)定義,所以,做出各種嘗試,均告失敗。
2、兩種T-SQL語法
1、select...into...from
2、insert into ... select
第一次接觸select...into...from...和insert into...select...有很多人都會誤解, 從表面上看都是把相關資訊查詢出來,然後新增到一個表裡,其實還遠遠沒有這麼簡單。
insert into select語句:其語法形式為:Insert into Table2(field1,field2,...) select value1,value2,... from Table1
select into from 語句:該語法形式為:select vale1, value2 into Table2 from Table1
區別:insert into select語句,這裡的要求就是Table2必須已經存在,如果不存在,系統則會提示物件無效,而select into from語句,這裡要求的是MyTable1不存在,因為在插入的時候,系統會自動建立MyTable1,如果之前MyTable1已經被建立,系統就會提示已經存在表。
3、解決方案
上面為什麼要講兩種T-SQL語法呢,正是因為我想要模仿上述語句,將一個儲存過程,替換select語句查詢出來的表,來進行實現,結果發現,無論是insert into select 還是 select into from,均無法實現需求。
例如:select * into abc exec getcltpossales_sp '','','','',''
PS:getcltpossales_sp是系統中存在的一個儲存過程,執行出來的結果是一張表。
錯誤資訊:Msg 263, Level 16, State 1, Line 1
必須指定要從中選擇的表。
Msg 1038, Level 15, State 5, Line 1
缺少物件或列名,或者物件或列名為空。對於 SELECT INTO 語句,請確保每列均具有名稱。對於其他語句,請查詢空的別名。不允許使用定義為 "" 或 [] 的別名。請將別名更改為有效名稱。
解決:
在儲存過程多定義一個傳入引數@TempTableName varchar(50) ,為臨時表名,在儲存過程做查詢的時候用select into from 方法,最後執行。中間具體實現就不給出了。
create proc [dbo].[getsizepossales_sp]
(
@REGIONcode varchar(50),
@hzcode varchar(50),
@dkhflag varchar(50),
@beginyear varchar(10),
@endyear varchar(10) ,
@TempTableName varchar(50)
)
set @SQL= '
select keyid,period,state,year,xsdigit,tbrate,hbrate,ljtbrate,ljhbrate
,case when [month]=1 then sum(xsdigit) end Jan
,case when [month]=2 then sum(xsdigit) end Feb
,case when [month]=3 then sum(xsdigit) end Mar
,case when [month]=4 then sum(xsdigit) end Apr
,case when [month]=5 then sum(xsdigit) end May
,case when [month]=6 then sum(xsdigit) end Jun
,case when [month]=7 then sum(xsdigit) end Jul
,case when [month]=8 then sum(xsdigit) end Aug
,case when [month]=9 then sum(xsdigit) end Sep
,case when [month]=10 then sum(xsdigit) end Oct
,case when [month]=11 then sum(xsdigit) end Nov
,case when [month]=12 then sum(xsdigit) end Dec
into '[email protected]+' from #Retable group by keyid,period,[month] ,state,year,xsdigit,tbrate,hbrate,ljtbrate,ljhbrate '
--select @SQL
EXEC(@SQL)