2010-11-09 13 views
1

Je voudrais faire quelque chose comme ça dans SQLSQL INSERT INTO appelant une procédure stockée à la place

Insérer dans storedproc2 SELECT colonne1, colonne2 de Tablename

Mon but est d'avoir chaque ligne de données dans tablename traitées en utilisant la procédure stockée storedproc2, qui elle-même gère toute insertion nécessaire dans le flux logique.

+0

Avez-vous trouvé les réponses? Si les réponses fournies ont répondu à votre question, veuillez en marquer une comme réponse. –

Répondre

1

Vous ne pouvez pas insérer dans une procédure stockée. Vous ne pouvez insérer dans une table (et dans certains cas, une vue, selon la plate-forme DB et si la vue est actualisable.)

Vous peut utiliser une procédure stockée pour insérer des données comme indiqué ici: http://www.codeproject.com/KB/cs/tariqaziz.aspx

Ce n'est pas censé être insultant, mais utile ...

on dirait que vous avez besoin d'aller lire sur les procédures stockées, puisque votre question montre que vous ne recevez pas les bases.

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

0

Comme David a dit, vous ne pouvez pas le faire comme vous le souhaitez. Ce que vous pouvez faire est d'alimenter la proc table stockée en tant que paramètre, et de faire en sorte qu'elle soit logique sur chaque ligne de cette table. Cela impliquera du SQL dynamique mais c'est faisable.

0

Vous pouvez placer une instruction d'insertion à l'intérieur d'un processus stocké et transmettre les valeurs en tant que paramètres, par ex.

Voici juste un exemple, sur chaque ligne que vous pouvez appeler votre proc stocké et il devrait être bien

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

Vous ne pouvez pas passer des ensembles de données aux procédures stockées, seuls les paramètres. Vous pouvez:

  • Transmettre le nom de la table à la procédure stockée, puis construire la sélection.
  • Transmet l'ensemble de la requête en tant que paramètre.

Ensuite, exécutez-le avec sp_executesql. Si vous utilisez cette méthode, vous devriez lire The Curse and Blessings of Dynamic SQL.

2

Comme d'autres l'ont dit, vous ne pouvez pas le faire sur une seule instruction. (C'est juste comme cela fonctionne)

Si ce que vous voulez, c'est d'appeler un proc avec les résultats, vous pouvez d'abord sélectionner puis appeler le proc en utilisant un curseur. Le curseur exécuterait un code ligne par ligne et vous seriez en mesure d'appeler le proc en transmettant les valeurs correctes. Mais attention, les curseurs utilisent lentement des drapeaux comme FAST_FORWARD. L'autre façon serait de changer votre proc pour accepter une table entière, en tant que paramètre de table, si cela est possible, cela fonctionnerait vraiment mieux.

Espérons que cela aide.

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 pour l'utilisation d'un curseur – garik

Questions connexes