web-dev-qa-db-fra.com

Insertion de Microsoft SQL Server à partir d'une requête sélectionnée

Ce que j'essaie de faire: lire les journaux et insérer les données nécessaires dans 3 tableaux différents qui obtiennent des informations les uns des autres.

LOG_ITEM201303 se trouve sur gamelogs db.
Mail_Item_Table, Mail_List_Table, Mail_Message_Table se trouve sur le jeu db.

Les tables de messagerie sont connectées via les index.

CHAR_KEY, NAME, ITEMNUM sont les valeurs que je dois utiliser pour mes requêtes.

La requête pour moi d'obtenir les données des journaux:

SELECT CHAR_KEY, NAME, ITEMNUM
FROM LOG_ITEM201303
where 
(   
    ITEMNUM = 14317
OR  ITEMNUM = 14318
OR  ITEMNUM = 15478
OR  ITEMNUM = 15479
OR  ITEMNUM = 14301
OR  ITEMNUM = 14302
OR  ITEMNUM = 15476
OR  ITEMNUM = 15477
OR  ITEMNUM = 15018
OR  ITEMNUM = 15019
OR  ITEMNUM = 15020
OR  ITEMNUM = 15021
OR  ITEMNUM = 15022
OR  ITEMNUM = 15023
OR  ITEMNUM = 15024
OR  ITEMNUM = 15025
OR  ITEMNUM = 14437
OR  ITEMNUM = 14438
OR  ITEMNUM = 15656
OR  ITEMNUM = 15657
OR  ITEMNUM = 15658
OR  ITEMNUM = 15659
OR  ITEMNUM = 15660
OR  ITEMNUM = 15661
OR  ITEMNUM = 15662
OR  ITEMNUM = 15663
) AND (KIND = 133) AND (Convert(varchar, OCCUR_TIME,111) < '2013/03/22')

Exemple de résultat de la requête de journaux ci-dessus (les résultats réels totaux sont en 600+):

 CHAR_KEY        NAME            ITEMNUM
 -----------+----------------+-----------
 28257      |   clarkailey   |   14438
 894367     |   Wolf         |   15023
 2869858    |   HOPEINME     |   14437

Maintenant, je dois insérer automatiquement chaque ligne dans cette requête:

 CHAR_KEY        NAME            ITEMNUM
 -----------+----------------+-----------
 2869858    |   HOPEINME     |   14437

(cette requête montre un exemple du 3e exemple de données ci-dessus inséré ...
au lieu de faire cette requête pour chaque entrée, y a-t-il un moyen pour que cela se fasse plus rapidement?)

INSERT INTO Mail_Item_Table
(ItemNumber, ItemInfo, ReceiveDate)
VALUES
(14437,       --this is the ITEMNUM
    (SELECT CONVERT(BINARY(16), REVERSE(CONVERT(BINARY(16), 14437)))), NULL)

INSERT INTO Mail_Message_Table
(Message)
VALUES
('Automated Message from the ADMIN.')

INSERT INTO Mail_List_Table
(ReceiverCharKey, MailListIndex, MailItemIndex, MailMessageIndex, Sender, Receiver, SendDate)
VALUES 
(2869858,       --this is the CHAR_KEY
(SELECT TOP 1   MailListIndex+1 as last_entry
 FROM           Mail_List_Table
 WHERE          sender = 'SENDER'
 ORDER BY       MailListIndex DESC),
(SELECT TOP 1   MailItemIndex AS last_entry
 FROM           Mail_Item_Table
 ORDER BY       MailItemIndex DESC),
(SELECT TOP 1   MailMessageIndex AS last_entry
 FROM           Mail_Message_Table
 ORDER BY       MailMessageIndex DESC),
 'SENDER', 
 'HOPEINME', --this is the NAME
 getdate())

Ma question:

Comment automatiser tout cela, que la requête lira tous les journaux et insérera les données ligne par ligne. Merci beaucoup.


Puis-je utiliser @variables pour cela?

19
madziikoy

Vous pouvez utiliser la syntaxe suivante pour les insertions

INSERT INTO dbo.Destination (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM dbo.Source

Si vous aviez des tables avec les mêmes colonnes ou un jeu de résultats qui avait les mêmes colonnes que votre destination, vous n'avez pas besoin de spécifier de colonnes dans INSERT.

INSERT INTO dbo.Destination
SELECT *
FROM dbo.Source

Ces deux éléments sont basés sur votre table de destination déjà en cours de création. Ce sont PAS identiques à SELECT * INTO dbo.Destination FROM dbo.Source

36
Vinnie