2009-03-13 8 views

Répondre

0

Merci Harpo pour votre réponse. J'ai utilisé cette idée pour créer l'instruction SQL suivante. Nous avons beaucoup de tables 50+ qui ont toutes le même type de données (identifiant employé) mais ce nom de champ peut être différent. Ainsi, en fonction du nom de la table, le champ à mettre à jour sera différent. Mes instructions WHERE et SET sont plus compliquées que cet exemple, mais ce n'est pas important pour ce problème.

Je crée d'abord une table temporaire pour stocker la table/champs que je veux mettre à jour. Je boucle ensuite sur ces enregistrements et génère le code SQL. Pour ceux d'entre vous qui n'aiment pas, SQL dynamique, vous pouvez simplement utiliser une instruction print, puis copier le coller dans une autre fenêtre de requête et l'exécuter. Ou vous pouvez appeler la déclaration EXEC. Je voudrais accepter vos réponses, mais je n'ai pas répondu à ma question, en partie parce que je ne me suis pas expliqué complètement. De toute façon, merci pour votre aide.

DECLARE @TableFieldDictionary TABLE 
(
    tablename VARCHAR(100), 
    fieldname varchar(100) 
) 

insert into @TableFieldDictionary(tablename,fieldname) values ('table1','field1'); 
insert into @TableFieldDictionary(tablename,fieldname) values ('table2','field2'); 
--put more insert statements here. In my case, I have 50 inserts 


declare cursor_dictionary cursor 
for select tablename, fieldname from @TableFieldDictionary 

open cursor_dictionary 

declare @looptablename VARCHAR(100) 
declare @loopfieldname varchar(100) 

fetch next from cursor_dictionary 
into @looptablename,@loopfieldname 

DECLARE @UpdateSql AS varchar(max) 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @UpdateSql = 'UPDATE ' + @looptablename + 
        ' SET ' + @loopfieldname + ' = 123' + 
      ' WHERE ' + @loopfieldname + ' = 456' 

    print @updatesql 
    --EXEC(@updatesql) 

    fetch next from cursor_dictionary 
    into @looptablename,@loopfieldname 
END 

CLOSE cursor_dictionary 
DEALLOCATE cursor_dictionary 
2

Vous devez utiliser SQL dynamique pour ce. La fonction EXEC exécutera une instruction sql ad-hoc passée en tant que chaîne.

DECLARE @UpdateSql AS varchar(2000) 

foreach @tablename in ArrayOfTablesObjects 

SET @UpdateSql = 'UPDATE ' + @tablename + ' SET ' + @fieldname ' + = ''xyz'' WHERE ' + @fieldname + ' = ''123''' 
EXEC (@UpdateSql) 

end foreach 
+0

* rire * Il semble que la course soit au marteau (dactylos). – MarkusQ

+0

En fait, j'ai vu cela quand je naviguais sur mon ordinateur portable, alors j'ai sauté ici où j'étais connecté (je ne connais pas mon ID ouvert). – harpo

2

Ceci peut uniquement être fait en utilisant SQL dynamique. C'est une technique très dangereuse à utiliser et ne devrait jamais être faite sans beaucoup de réflexion sur la façon dont elle pourrait nuire à la base de données et comment vous pouvez l'écrire plus attentivement pour protéger la base de données. Veuillez lire cet article avant d'envisager d'écrire du SQL dynamique. http://www.sommarskog.se/dynamic_sql.html

Questions connexes