8
votes

Comment puis-je mettre à jour plusieurs colonnes avec un remplacement dans SQL Server?

Comment mettre à jour différentes colonnes et lignes sur une table? Je veux faire quelque chose de similiaire à Remplacer une chaîne dans SQL Server

Je veux faire cela, mais la valeur existe dans plusieurs colonnes du même type. Les valeurs sont des clés étrangères Varchars à une table des employés. Chaque colonne représente une tâche, le même employé peut donc être attribué à plusieurs tâches dans un enregistrement et ces tâches varieront entre les enregistrements. Comment puis-je faire cela efficacement? Fondamentalement, quelque chose de remplacer toutes les colonnes variables d'Accross sur une table.

Merci pour toute aide ou conseil.

acclamations, ~ ck à San Diego


6 commentaires

Ce serait une indication que votre dB n'est pas NORAMLISÉ? (c'est-à-dire en 3nf)


Je suis plus d'un C # Dev donc je ne connais pas le fonctionnement intérieur de la base de données. Je suis curieux de savoir comment vous représenteriez cette relation correctement? Si chaque enregistrement dans une table représentait un projet et que chaque colonne représente une tâche et qu'un employé peut être attribué à une ou plusieurs tâches. Où est la duplication? Comment puis-je remédier à cela? S'il vous plaît donnez votre avis.


Je pense que vous devriez donner un exemple de ce que vous avez et ce que vous voulez changer. Il est difficile de formuler une requête SQL sans avoir une bonne idée de ce que ressemble aux données.


Typiquement, vos clés étrangères sont int et non varcharnes. De cette façon, vous n'avez pas ce type de problème. De cette manière, un seul enregistrement d'employé peut être lié à plusieurs tâches et vous utilisez simplement l'ID de l'employé. Vous pouvez également avoir une table de référence croisée qui relie également les employés aux tâches. Cela signifie 3 tables et pas seulement 2, mais c'est une chose commune.


Tempnum Jempnum Yempnum xempnum 0 15059 0 15059 13456 13456 13456 13456 15059 15059 15059 15059 15059 15059 15059 15059 15059 15059 15059 15059 - Dites que je voulais mettre à jour chaque occurrence de 15059 à 13673? Bien que ce soient numériques, de nombreuses valeurs contiennent du texte comme Rh6754 et ce qui n'est pas. Merci. :)


Oui Steve Je sais à propos de l'INT, mais en théorie tant que les valeurs sont uniques et qu'elles sont appliquées, il n'ya vraiment aucun problème à avoir un Varcharne comme clé primaire. Voir Northwind Clients Table 'Alfki' Lol.


3 Réponses :


12
votes

Cela devrait faire l'astuce: xxx

etc ...


4 commentaires

Et c'est ok si la chaîne n'existe pas dans la colonne? ok cela semble cool. Je voudrais simplement l'appliquer à tous les colonnes possibles ??? Merci pour le conseil. Je vais essayer ceci. Doux!


S'il vous plaît, n'essayez pas tout de suite sur le système de production (ou au moins faire une sauvegarde en premier).


De plus, vous pouvez utiliser une clause WHERE pour réduire beaucoup les choses (probablement).


Juste pour mettre à jour les parties intéressées; J'ai rencontré un peu un problème avec cela. Le type de données est Varchar (7), si "Newstring" est la même longueur ou plus courte que "oldstring" tout va bien, mais lorsque j'essayais d'aller dans l'autre direction, les données seront tronquées d'erreurs élevées leur tête laid. Une manière moins efficace est venue à l'esprit et qui devait exécuter une mise à jour sur chaque colonne de la part de la part descs stockées Tableau de mise à jour 1 Set Field1 = 'Newstring' où Field1 = 'oldstring' end, puis faire la même requête pour Field2, Field3, Filedn . Je suis sûr que ce n'est pas efficace, mais le résultat est ce que je cherchais. Merci a tous!



0
votes

En réponse à la question complémentaire de l'affiche sur la normalisation de cette structure de données. Voici comment vous le feriez:

Project
-------
ProjectID
ProjectName
etc...

Employee
--------
EmployeeID
EmployeeName
etc...

Task
----
TaskID
ProjectID
EmployeeID
TaskDescription
etc...


1 commentaires

Ah, alors tous les paris sont éteints :) Pour ce que ça vaut la peine, c'est une affaire beaucoup plus grande que "un peu dénormalisée". C'est la première forme normale qui est violée, pas le 3ème. Il existe des circonstances qui appellent à des tables d'aplatissement d'une manière qui duplique les données, mais ce n'est pas ce qui se passe ici. Ceci est juste une génération de douleur sans bénéfice.



1
votes

L'idée principale est de créer une phrase de mise à jour SQL, peu importe le nombre de champs de la table. Il a été créé sur SQL Server 2012, mais je pense que cela fonctionne également sur 2008.

Table d'échantillonnage: p> xxx pré>

Obtenez uniquement les champs Varcharchar et Nvarchars. Changer Old_text strong> et nouvel_text fort> accord à votre exigence. Changer System_Type_ID em> valeurs si vous avez besoin de correspondance non seulement des champs Varcharton et NvarchaRar. P>

UPDATE dbo.SampleTable SET  
    [Field2] = REPLACE([Field2], 'OLD_TEXT', 'NEW_TEXT'), 
    [Field3] = REPLACE([Field3], 'OLD_TEXT', 'NEW_TEXT'), 
    [Field4] = REPLACE([Field4], 'OLD_TEXT', 'NEW_TEXT'), 
    [Field6] = REPLACE([Field6], 'OLD_TEXT', 'NEW_TEXT');


1 commentaires

Solution géniale!