SQL INSERT INTO调用存储过程

时间:2010-11-09 16:13:00

标签: sql sql-server-2005 tsql

我想在SQL中做这样的事情

插入storedproc2 从表名

中选择column1,column2

我的目标是使用storedproc2存储过程处理tablename中的每一行数据,该存储过程本身处理逻辑流中所需的任何插入。

5 个答案:

答案 0 :(得分: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)

您无法插入存储过程。您只能插入表格(在某些情况下是视图,具体取决于数据库平台以及视图是否可更新。)

可以 使用存储过程插入数据,如下所示:http://www.codeproject.com/KB/cs/tariqaziz.aspx

这并不意味着侮辱,而是非常有帮助......

听起来你需要阅读存储过程,因为你的问题表明你没有得到基础知识。

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

答案 2 :(得分:0)

正如大卫所说,你不能按照你想要的方式做到这一点。

您可以做的是将存储过程作为参数提供给表,并让它在该表的每一行上执行它的逻辑。它将涉及一些动态SQL,但它是可行的。

答案 3 :(得分:0)

您可以将insert语句放在存储过程中,并将值作为参数传递,例如

以下只是一个示例,您可以在每一行调用存储过程,它应该没问题

 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

答案 4 :(得分:0)

您无法将数据集传递给存储过程,只能传递参数。你可以:

  • 将表名传递给存储过程,然后构造select。
  • 将整个查询作为参数传递。

然后使用sp_executesql执行它。如果您使用此方法,请阅读The Curse and Blessings of Dynamic SQL