Une boucle dans le jeu de résultats SELECT en SQL
Je ne suis même pas sûr de savoir comment mot à cette question, mais voilà. J'ai besoin d'être en mesure de boucle à travers un ensemble de résultats, dans le même script SQL, et d'utiliser les résultats plus en SQL.
Par exemple
begin
SELECT (SELECT ColumnA, ColumnB from SomeTable) as x
loop through x(
INSERT ColumnA into TableA
INSERT ColumnB into TableB
)
end
Mais j'ai oublié la manière exacte de le faire. Je sais que je l'ai fait avant, lors d'une précédente position, mais je ne trouve pas le code dans mes fichiers de l'entreprise.
Évidemment, c'est une très brut et de l'exemple de base et j'ai l'intention de faire beaucoup plus avec le jeu de résultats, mais j'ai juste donné un exemple.
EDIT: Voici un exemple plus proche de ce que j'essaie de faire, si cela peut aider.
begin
while(select columnA, columnB, columnC, columnD from myTable) as x
begin
INSERT columnA, columnB into TableA
(get newly created ID of TableA - but that's a separate question involving @@IDENTITY)
INSERT NewID, columnC, columnD into TableB
end loop
end
Jetez un oeil à cette question: stackoverflow.com/questions/6606709/...
J'ai aussi un peu regardé les curseurs, et je ne me souviens pas de l'aide de cette méthode pour ce faire. Je suis ouvert à elle, mais je pense que j'ai été en utilisant quelque chose d'autre.
Essayez de Dépouillement des tableaux dwaincsql.com/2014/03/27/tally-tables-in-t-sql
Le curseur. Venez sur faire plus que de pseudo-code. MSDN a des échantillons.
Voir stackoverflow.com/q/5365629/73226 pour savoir comment obtenir les valeurs d'id alloué.
J'ai aussi un peu regardé les curseurs, et je ne me souviens pas de l'aide de cette méthode pour ce faire. Je suis ouvert à elle, mais je pense que j'ai été en utilisant quelque chose d'autre.
Essayez de Dépouillement des tableaux dwaincsql.com/2014/03/27/tally-tables-in-t-sql
Le curseur. Venez sur faire plus que de pseudo-code. MSDN a des échantillons.
Voir stackoverflow.com/q/5365629/73226 pour savoir comment obtenir les valeurs d'id alloué.
OriginalL'auteur Reverend Bubbles | 2015-02-24
Vous devez vous connecter pour publier un commentaire.
La façon habituelle de gérer l'obtention de l'identité dans un ensemble en fonction de la manière grâce à la
SORTIE
clause:Le problème ici est que ce que vous l'idéal serait de le faire est: est-ce
Le problème est que vous ne pouvez pas référence à la table source dans la SORTIE, seule la cible. Heureusement, il existe une solution de contournement pour ce à l'aide de
MERGE
, car cela vous permet de vous servir de référence à la fois dans la mémoire résidente inséré table, et la table source dans la clause output si vous utilisezMERGE
sur une condition qui ne sera jamais vrai que vous pouvez la sortie de toutes les colonnes dont vous avez besoin:Le problème avec cette méthode est que SQL Server n'autorise pas à insérer de chaque côté d'une relation de clé étrangère, donc si tableB.NewID références tableA.L'identité de la ci-dessus échoue. Pour contourner cela, vous aurez besoin à la sortie dans une table temporaire, puis insérez la table temporaire dans TableB:
Exemple sur SQL Violon
J'ai été dans le processus d'ajout d'un montage pour présenter une sortie dans une table temporaire,mais pour des raisons différentes. Même si l'utilisation de l'
MERGE
est nécessaire. Comment évolutive, voulez-vous de répondre? Elle remplit les critères de la question de l'insertion d'une table et de la sortie nouvellement inséré id, et des colonnes de la table d'origine dans une troisième table. Si la manipulation est nécessaire, alors oui, l'approche évidente serait d'utiliser une table temporaire.Il n'a pas besoin d'être terriblement évolutive. Cela ne va pas être une chose régulière. Je vais importer des listes d'adresses. Il peut arriver de nouveau dans l'avenir, mais pas souvent. Je n'ai pas besoin de la meilleure performance sur le présent car il va vraiment se faire en une seule fois, ou au moins une fois depuis bien longtemps, d'un événement.
OriginalL'auteur GarethD
Dans
SQL
il est appeléCURSORS
. La structure de base deCURSOR
est:Une autre façon de solution itérative est
WHILE
boucle. Mais pour que cela fonctionne vous devez avoir l'identité unique de la colonne dans une table. Par exempleMais notez que vous devriez éviter d'utiliser des
CURSORS
si il existe des alternatives pas de façon itérative de faire le même travail. Mais bien sûr, il ya des situations où vous ne pouvez pas éviter deCURSORs
cursors
.OriginalL'auteur Giorgi Nakeuri
Ne pas utiliser un curseur qu'il n'est pas bon quand il s'agit de performance.
Essayer ce lien:
http://support2.microsoft.com/kb/111401
Vous devez utiliser la fonction ROW_NUMBER() et remplir les données dans une table temporaire -soit variable ou un tableau global.
L'insertion de vos résultats dans une table temporaire et boucle à travers eux est le même que l'aide d'un curseur, mais de moins en moins gérable. Si vous déclarez un curseur avec les options appropriées, puis il fonctionnera mieux qu'une boucle while sur une table temp. Pour un peu de lecture - Mauvaises Habitudes pour le Coup : Penser à une boucle WHILE n'est pas un CURSEUR
OriginalL'auteur user3514987
Si vous êtes seulement en insérant les données d'une table vers une autre, vous pouvez utiliser cette approche:
Edit:
Vous pouvez ajouter une colonne dans la
TableA
de la clé étrangère demyTable
. Cela vous aidera à obtenir l'ID deTableA
dansTableB
.Il n'y a pas de clé étrangère de la TableA dans myTable. L'ID dans le TableA est généré sur l'insert.
Je sais. Je ne vois aucun mal dans l'ajout d'il y
Mais ce serait aller? l'ID je suis à la recherche de ne pas exister jusqu'à ce que l'insert
Le PK de
myTable
est inséré dansTableA
. Ensuite, pourTableB
, il y a déjà un connexes pourTableA
etmyTable
. Vous pouvez ajouter unwhere
pour sélectionner les enregistrements à partir demyTable
qui ne sont pas nécessaires dansTableB
.OriginalL'auteur Farhan