2013-02-20 25 views
0

我有一個插入存儲過程,我想根據用戶發送的參數值動態設置SELECT子句表。我將發佈一個示例我認爲它應該看起來像:SQL Server:如何在INSERT存儲過程中動態設置FROM值

*編輯,我最初發布不正確的代碼示例。我道歉*

CREATE PROC [spInsertLOG_ReqClone] 
    (@NewReqID char(8), 
    @ReqID char(8), 
    @SiteCode char(3), 
    @RequestorID char(6), 
    @CloneFromPo bit) 

AS BEGIN 
DECLARE @ReqCreatedDate datetime = GetDate() 
SET @NewReqID = dbo.fnLOG_ReqIDGenerator(@SiteCode) --Generates New ReqID 

INSERT INTO LOG_ReqHeader (

     ReqID, 
     ReqCreatedDate, 
     RequestDate, 
     RequiredByDate 

     ) 
(SELECT 
@NewReqID, 
@ReqCreatedDate, 
@ReqCreatedDate, 
@RequiredByDate 


FROM LOG_ReqHeader h 
WHERE h.ReqID = @ReqID) 


INSERT INTO LOG_ReqLineItems 
(ReqID, 
    QtyOrdered, 
    UI, 
    PartNumber, 
    Nomenclature) 

If @CloneFromPO = 0 -- Use line items intially entered in ReqLineITems table 
BEGIN 
(SELECT 
@NewReqID, 
l.QtyOrdered, 
l.UI, 
l.PartNumber, 
l.Nomenclature 

FROM ReqLineItems l 
WHERE l.ReqID = @ReqID) 

END 

If @CloneFromPO = 1 -- Use line items after PO was issued from PO table 

Begin 
(SELECT 
@NewReqID, 
l.Qty_Ord, 
l.UnitOfIssue, 
l.Part_Number, 
l.Item_Desc 

FROM PO_LineItems l 
WHERE l.ReqID = @ReqID) 

END 
END 

回答

0

您需要一種方法是使用dynamic SQL做到這一點。你趕去和使用動態SQL之前,我會建議你閱讀這篇文章:http://www.sommarskog.se/dynamic_sql.html

+0

動態SQL可能是實現它的一種方法,但它不是唯一的方法。 :-) – 2013-02-20 01:05:09

+0

幾乎總是有不止一種方法去皮膚貓:-) – 2013-02-20 06:15:37

+0

是的,但「你需要」意味着只有一個。 – 2013-02-20 09:28:23

0

這不是因爲重複的一個非常漂亮的解決方案,但是這可能是你想要什麼:

CREATE PROC [spInsertLOG_ReqClone] 

(@NewReqID char(8), 
@ReqID char(8), 
@SiteCode char(3), 
@RequestorID char(6), 
@CloneFromPo bit) 

IF @CloneFromPo = 0 

BEGIN 
    INSERT INTO LOG_ReqHeader ( 
      ReqID, 
      ReqCreatedDate, 
      RequestDate, SOME_OTHER_FIELDS) 
    (SELECT 
    @NewReqID, 
    @ReqCreatedDate, 
    @ReqCreatedDate, SOME_OTHER_FIELDS 
     FROM Table_1 
     WHERE reqID = @ReqID) 

END 

IF @CloneFromPo = 1 

BEGIN 
    INSERT INTO LOG_ReqHeader ( 
      ReqID, 
      ReqCreatedDate, 
      RequestDate, SOME_OTHER_FIELDS) 
    (SELECT 
    @NewReqID, 
    @ReqCreatedDate, 
    @ReqCreatedDate, SOME_OTHER_FIELDS 
     FROM Table_1 
     WHERE reqID = @ReqID) 

END 
3

這裏有一種方法,儘管我懷疑動態SQL在計劃質量和穩定性方面可能會更好:

INSERT dbo.LOG_ReqHeader 
( 
    ReqID, 
    ReqCreatedDate, 
    RequestDate, 
    other columns 
) 
SELECT 
    @NewReqID, 
    @ReqCreatedDate, 
    CURRENT_TIMESTAMP, 
    other columns 
FROM 
(
    SELECT col1, col2, col3 
    FROM dbo.table1 
    WHERE @CloneFromPo = 0 
    AND ReqID = @ReqID 
    UNION ALL 
    SELECT col1, col2, col3 
    FROM dbo.table2 
    WHERE @CloneFromPo = 1 
    AND ReqID = @ReqID 
) AS x; 
+0

我可能沒有做足夠好的工作來解釋我克隆的兩張表。 Table_1將包含用戶原先輸入到系統中的申請行項目,而Table_2將是實際獲得的最終採購訂單。用戶會指出他們需要克隆哪兩個,所以在這種情況下聯合不起作用。感謝您的意見。 – 2013-02-20 18:43:55

+0

爲什麼不同架構的兩張表?如果是這樣,那麼爲了執行插入操作,不要輸出結果必須匹配嗎?也許編輯這個問題,讓它顯示你想要做的事情而不是一堆僞毫無意義 – 2013-02-20 18:47:35

+0

我剛剛意識到我沒有在原始文章中添加正確的代碼,對於疏忽感到非常抱歉。我將編輯原始帖子,並嘗試更清楚我想要的內容。 – 2013-02-21 00:27:34

相關問題