2010-11-09 64 views
1

我願做這樣的事情在SQLSQL INSERT INTO調用存儲過程,而不是

插入進storedproc2 SELECT列1,列2,從表名

我的目標是有處理的表名數據的每一行使用storedproc2存儲過程,它本身處理邏輯流程中所需的任何插入操作。

+0

已在此處發佈的答案幫助到了您?如果此處提供的答案已回答您的問題,請將其標記爲已回答。 – 2010-11-09 18:10:14

回答

1

您無法插入存儲過程。您只能插入表(在某些情況下視圖,這取決於數據庫平臺上,是否視圖是可更新的。)

可以使用存儲過程來插入數據,如下所示:http://www.codeproject.com/KB/cs/tariqaziz.aspx

這並不意味着是侮辱,而是樂於助人......

這聽起來像你需要去存儲過程讀了,因爲你的問題表明你沒有得到的基本知識。

http://databases.about.com/od/sqlserver/a/storedprocedure.htm

0

正如大衛說,你不能這樣做你想要的方式。

你可以做的是將存儲過程的表作爲參數提供給表,並讓它在表中的每一行上執行它的邏輯。它將涉及一些動態SQL,但它是可行的。

0

您可以將插入語句放入存儲過程中,並將值作爲參數傳遞,例如

以下僅僅是一個例子,在每一行,你可以打電話給你的存儲過程,它應該是罰款

CREATE PROC BDD_AddMessageLogItem(
      @BusinessDevelopmentItemId INT, 
      @MessageLog NVARCHAR(MAX), 
      @PostedBy SMALLINT, 
      @PostedOfficeId TINYINT, 
      @PostedDepartmentId TINYINT, 
      @PostedMessageLogType TINYINT) 
      AS 
    BEGIN 

     DECLARE @BusinessDevelopmentMessageLogId SMALLINT 





    INSERT INTO dbo.BusinessDevelopmentItemMessageLogs 
    (BusinessDevelopmentItemId , 
     MessageLog , 
     DatePosted,   
     PostedBy, 
     PostedOfficeId, 
     PostedDepartmentId, 
     PostedMessageLogType, 
     BusinessDevelopmentMessageLogId 
    ) 
    VALUES (@BusinessDevelopmentItemId , -- BusinessDevelopmentItemId - int 
     @MessageLog , -- Message - nvarchar(100)   
     GETDATE(), 
     @PostedBy, 
     @PostedOfficeId, 
     @PostedDepartmentId, 
     @PostedMessageLogType, 
     @BusinessDevelopmentMessageLogId   
    ) 
    END 
0

你不可錯過的數據集存儲過程,只有參數。您可以:

  • 將表名傳遞給存儲過程,然後構造select。
  • 將整個查詢作爲參數傳遞。

然後用sp_executesql執行它。如果你使用這種方法,你應該閱讀The Curse and Blessings of Dynamic SQL

2

就像其他人說的那樣,你不能在一個聲明中這樣做。 (這是事情的工作方式)

如果你想要調用一個proc的結果,你可以先選擇,然後使用遊標調用proc。 遊標將按行代碼執行一行,您將能夠調用傳遞正確值的proc。但要小心使用緩慢的標誌,如FAST_FORWARD。

另一種方法是將您的proc更改爲接受整個表,作爲表值參數,如果這是可能的,那將表現得更好。

希望這會有所幫助。

DECLARE CallingProcCursor CURSOR 
FAST_FORWARD 
FOR 
SELECT database_id,name from sys.databases 
DECLARE @database_id int, @name sysname 
OPEN CallingProcCursor 

FETCH NEXT FROM CallingProcCursor INTO @database_id, @name 
WHILE (@@fetch_status <> -1) 
BEGIN 
    IF (@@fetch_status <> -2) 
    BEGIN 
     EXEC PROCX @database_id, @name 
    END 
    FETCH NEXT FROM CallingProcCursor INTO @database_id, @name 
END 

CLOSE CallingProcCursor 
DEALLOCATE CallingProcCursor 
GO 
+1

使用光標+1 – garik 2010-11-09 16:32:01