2017-06-30 5 views
0

Table ta a colonne comme ci-dessous:sqlserver mettre à jour une valeur de colonne fixe

a, b, c

puis-je ajouter colonne d pour déposer ta (valeur de colonne d'réponse sur le code ci-dessous pour générer)

select a+'-'+ rtrim(b) +'-'+ cast(row_number() over(order by a) as varchar) +'-tanew' as d from main 

J'ai essayé d'insérer dans, mais il couvrira la valeur exsits dans la colonne a, b, c. comment puis-je faire pour conserver les données originales de a, b, c et insérer dans d comme le code ci-dessus?

merci beaucoup!

voici la solution finale de mon cas:

update ta set d = [a] +'-' + rtrim([b]) + [c] + '-tanew' 
+1

Ajoutez quelques exemples de données de table et le résultat attendu. (Comme texte formaté.) – jarlh

+0

Si vous voulez simplement remplir la nouvelle colonne, vous ne devez pas insérer, mais mettre à jour. –

+0

comment écrire l'instruction where en code sql? si je veux mettre à jour chaque ligne? thx –

Répondre

0

si vous êtes en utilisant SSMS, essayez :::

alter table main 
add d varchar(max) 
update main 
set d = 
(select a+'-'+ rtrim(b) +'-'+ cast(row_number() over(order by a) as varchar) +'-tanew' from main) 

--i assume col a and b are already in varchar format 
+0

obtenu des erreurs de grammaire indice –

+1

ajouter des parenthèses à la dernière sélection va éteindre l'erreur de grammaire. aussi ne peut pas utiliser de cette façon, car la valeur de retour du select n'est pas la monodromie. je vais considérer le curseur? –

+0

pouvez-vous s'il vous plaît montrer un instantané des données de la table? – PrinceKayastha

0

Vous ne devez pas créer et mettre à jour une colonne avec une valeur row_number. Il est difficile pour l'entretien de cette colonne lorsque vous insérez ou supprimez des lignes ou mettre à jour la colonne a

Il suffit d'utiliser une vue

CREATE VIEW dbo.YourViewName AS 
(
    SELECT *, 
     concat(a,'-', b,'-', row_number() over(ORDER BY Name)) AS d 
FROM dbo.YourTable t 
) 

et sélectionner les données

SELECT * FROM dbo.YourViewName vt 

Note:

  • Row_number est uniquement utilisé dans order by ou select clause
  • Si vous êtes en utilisant SQL 2012+, vous pouvez utiliser concat pour les chaînes de somme.
0

Dans SQL Server, vous devez utiliser un CTE actualisable:

with toupdate as (
     select t.*, 
      (a + '-' + rtrim(b) + '-' + cast(row_number() over (order by a) as varchar(255)) + '-tanew' 
      ) as new_d 
     from main 
    ) 
update toupdate 
    set d = new_d; 

Remarque: Chaque fois que vous utilisez varchar(), vous devriez toujours inclure une longueur. SQL Server par défaut la longueur à différentes valeurs en fonction du contexte. Les bogues qui résultent de ces défauts sont assez difficiles à déboguer.