1. 程式人生 > >實現將儲存過程作為inser into的資料來源,插入臨時表

實現將儲存過程作為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)