2011-05-02 3 views
0

Je dois mettre à jour des occurrences sélectionnées dans différentes tables de l'attribut [ISD_ID], comment puis-je accomplir cela?mettre à jour les attributs d'enregistrement dans plusieurs tables

Je peux saisir l'ensemble des tables qui possèdent les dossiers que je cherche avec cette déclaration:

SELECT c1.TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS c1 
INNER JOIN information_schema.COLUMNS c2 
ON c1.TABLE_NAME = c2.TABLE_NAME 
WHERE c1.COLUMN_NAME LIKE '%isd%id%' and c2.column_name LIKE '%schooldistrict%id%' 

Alors maintenant, j'ai un ensemble de noms de table que je voudrais itérer, la mise à jour enregistre si nécessaire.

Par une suggestion dans un autre article, j'ai lu sur SQL dynamique. Donc, je pourrais faire quelque chose comme EXECUTE IMMEDIATE: ('update' + @tablename + ' set ISD_ID=37 where SchoolDistrictID=46').

Ma question, alors, est: comment puis-je parcourir mes noms de table et les remplacer dans l'instruction ci-dessus comme la variable @tablename, de sorte que je peux mettre à jour les valeurs dans chaque table? J'ai également la possibilité d'utiliser .NET et SSIS si besoin est.

Merci d'avance; Je ne suis pas très compétent avec SQL et j'apprécie l'opportunité d'apprendre.

Répondre

0
  • Une façon bizarre Vous pouvez utiliser une procédure stockée sans papier (s'il vous plaît ne pas dire Remus Rusanu j'ai dit que), faire something like this. Vous utiliseriez la condition @where pour spécifier que la table doit contenir une colonne donnée.

  • Une façon plus classique consisterait à

    1. sélectionner les résultats de la requête dans une table temporaire ou une table de variables
    2. itérer sur la table temp/variable de table, en utilisant une boucle while, saisissant le nom de la table et son remplacement par la variable @tablename
    3. Exécutez votre requête ci-dessus. Attention, vous voudrez probablement créer une variable appelée quelque chose comme @myDynamicSQL, lui affecter le texte de l'instruction, puis appeler EXEC IMMEDIATE.

Honnêtement, le temps que vous avez terminé avec « façon bizarre », vous feriez mieux de ce faire de manière classique, mais je suis juste essayer d'être approfondie.

+0

Suite à votre suggestion, j'obtiens l'erreur ** doit déclarer la variable scalaire ** à ** ligne de conduite @tablename ** quand j'Execute: 'DECLARE @MyTable AS TABLE ( Table_nm NVARCHAR (128) NULL ) DECLARE @tablename AS NVARCHAR (128) @myDynamicSQL DECLARE AS TEXT = 'update' + @tablename + 'set ISD_ID = 37 où SchoolDistrictID = 46' TOUT (SELECT Table_nm dE @MyTable ) IS NOT NULL BEGIN SET @tablename = [ICI I OBTENIR UNE ERREUR ->] @ MyTable.Table_nm EXECUTE IMMEDIATE @myDynamicSQL CONTINUER FIN GO' – ElderJedi

+0

@ SebastianVal - vous devez saisir le paramètre Table_nm dans une variable. Donc, quelque chose comme ça fonctionnerait: 'SELECT TOP 1 @ tablename = table_nm de @ myTable'. Maintenant, je ferais aussi attention de vous assurer de supprimer l'enregistrement de @mytable lorsque vous en avez fini avec, ou d'utiliser un compteur pour empêcher une boucle sans fin. – dawebber

0

Si vous souhaitez utiliser SSIS pour cela, vous pouvez prendre le résultat de votre première requête dans une destination RecordSet.

Vous pouvez ensuite créer une boucle foreach sur la variable qui conserve le jeu d'enregistrements, puis créer une tâche SQL avec une expression qui exécute votre "UPDATE " + (DT_STR,255,1252)@[User::tblname] + " SET ....." en tant que sqlStatementSource.

+0

(où User :: tblname est la variable qui contient la valeur actuelle de votre colonne de jeu d'enregistrements qui est le nom de table) – cairnz

+0

Nous vous remercions de votre réponse. Cela semble être la façon la plus simple de le faire, mais je vais essayer d'apprendre quelque chose de nouveau SQL. – ElderJedi

+0

Ensuite, vous pouvez le faire assez facilement en utilisant un curseur sur votre requête, puis exécuter le SQL de façon dynamique. – cairnz

Questions connexes