2014-01-30 56 views
-1

我正在創建一個存儲過程以將數據插入表中。該表有8個字段。其中五個是輸入,另外三個需要從依賴於前五個的查詢中檢索。 在begin語句之前,我想創建一個temp_table(因爲它只需要一個查詢來獲取其餘的數據)和VALUES(從#temp_table中選擇col1,從#temp_table ...中選擇col2)。 真的需要一些幫助的語法和順序。從查詢中檢索數據的插入

CREATE PROCEDURE dbo.table 
    @ value1 int, 
    @ value2 int, ...etc 
AS 
    SET NOCOUNT ON 
    IF object_ID('tempdb..#temp_table') is not null drop table #temp_table 
    SELECT some stuff 
    INTO #temp_table 
    FROM some place 
    WHERE magical things happen... 
BEGIN 
    INSERT INTO dbo.table 
    (fields) 
    VALUES 
    (
     select colum1 from #temp_table 
     etc 
    ) 
END 

我哪裏錯了?

回答

2

你可以做這樣的事情

INSERT INTO Tab (col1, col2,....., col8) 
SELECT @var1, @var2, ...., var5, t2.val1, t2.val2, t2.val3 
FROM Tab2 t2 
WHERE (/*you can do your filtering here*/) 
+0

@MathLover它應該工作正常,是否有錯誤。 – user2989408

+0

@ uset2989408 yes:procedure lsp.insertTable ...關鍵字'SELECT'附近的語法不正確,並參照值 – MathLover

0

你也許可以做到這一點,而無需使用臨時表,可能通過使用公共表表達式。但是,如果創建臨時表更簡單,則無論如何都要這樣做。

CREATE TABLE #temp_table 
(
    col6 int, -- change data types as appropriate 
    col7 int, 
    col8 int 
    ... 
) 

INSERT INTO #temp_table 
SELECT value6, value7 ... FROM Whatever -- whatever the query is. 


INSERT INTO FinalTable 
(col1, col2, col3, col4, col5, col6, col7, col8) 
SELECT @param1, @param2, @param3, @param4, @param5, col6, col7, col8 
FROM #temp_table 

我不確定你說的是什麼意思,說你想在BEGIN之前創建臨時表。你的意思是在存儲過程之外,通過使用臨時表作爲表值參數,還是僅僅希望在存儲過程的最開始時創建臨時表?

ETA:好的,如果您在子查詢時遇到問題,可能是因爲您沒有將它們包裝在()中。試試這個:

INSERT INTO dbo.table 
(fields) 
VALUES 
(
    (select top 1 column1 from #temp_table) , 
    (select top 1 column2 from #temp_table) 
    -- etc 
) 

順便說一句,BEGINEND在存儲過程中是沒有必要的。你不需要把這段代碼放到一個塊中(因爲它不是有條件的或者是循環的),所以我要麼把BEGIN放回去,要麼把它們都取出來。

+0

中的行我已更新我的問題,以確切顯示我的意思 – MathLover

+0

@MathLover我希望我的更新的答案幫助。 –