我想在SQL中做这样的事情
插入storedproc2 从表名
中选择column1,column2我的目标是使用storedproc2存储过程处理tablename中的每一行数据,该存储过程本身处理逻辑流中所需的任何插入。
答案 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)
您无法将数据集传递给存储过程,只能传递参数。你可以:
然后使用sp_executesql
执行它。如果您使用此方法,请阅读The Curse and Blessings of Dynamic SQL。