2010-07-13 5 views
2

J'ai une table de base de données qui contient des champs. un de la valeur du champ est aussi commeInsérer une valeur à une position spécifique à l'aide de sqlserver 2005

,code,removeformat,undo,redo,cut,copy,color,|1|1,2,3,|0|500,400|1078,|False|500| 

Comment puis-je insérer « couleur » comme indiqué en utilisant cette requête SQL? J'utilise sql server 2005, C#. merci

+2

pas une base de données normalisée; n'importe quelle raison pourquoi? –

+1

Un peu plus d'informations s'il vous plaît, et un avant-après-exemple serait bien. – Bobby

+0

Voulez-vous toujours ajouter 'couleur' ​​comme dernière entrée de texte avant les premières entrées délimitées par des barres? –

Répondre

2

Je viens de trouver une solution. je ne sais pas si c'est bon .. vous pouvez me donner une solution normalisée ..

int startIndex = test.LastIndexOf(",|1"); 
string insert = test.Insert(startIndex, ",color"); 
SqlCommand cmd = new SqlCommand("update tableName set value='" + insert + "' where Id='1'", con); 
cmd.ExecuteNonQuery(); 
0

Je convertirais cette colonne en XML et stocker vos données comme une paire clé-valeur dans la base de données. Ensuite, vous pouvez simplement ajouter les valeurs supplémentaires au XML.

Vous pouvez également créer une vue de cette table pour convertir le XML dans le format ci-dessus s'il est nécessaire pour la compatibilité ascendante/descendante.

3

Il est très difficile de fournir une assistance utile sans plus d'informations sur le schéma de la table que vous souhaitez mettre à jour et sur certains ensembles de données avant et après. J'ai supposé que la colonne contient un ensemble de paires nom/valeur auxquelles vous voulez ajouter une nouvelle paire pour une ou plusieurs lignes connues, et que l'ordre des paires n'est pas important (c.-à-d. Acceptable toujours ajouter de nouvelles valeurs à la fin de la liste).

Si tout cela est correct, les éléments suivants peuvent vous aider. Deux lignes de données de test sont créées: la première ligne est ensuite mise à jour avec un nouveau nom (couleur) et une nouvelle valeur (500).

DECLARE @t TABLE 
(id INT 
,attributes VARCHAR(MAX) 
) 

INSERT @t 
     SELECT 1,',code,removeformat,undo,redo,cut,copy,|1|1,2,3,|0|500,400|1078,|False|' 
UNION SELECT 2,',code,removeformat,undo,redo,cut,copy,|1|1,2,3,|0|500,400|1078,|False|' 


UPDATE @t 
SET attributes = LEFT(attributes,CHARINDEX('|',attributes,0) - 1) + 'color,' + SUBSTRING(attributes,CHARINDEX('|',attributes,0),999999) + '500|' 
WHERE id = 1 

SELECT * 
FROM @t 
0

NOTE: Cela suppose l'ordre n'a pas d'importance dans la chaîne.

Utilisez une fonction CLR personnalisée ou SQL# pour diviser d'abord la chaîne dans une table à 1 colonne à l'aide de la fonction SQL # Split (utilisez CROSS APPLY). UNION sur la valeur que vous souhaitez insérer au dos de la requête que vous avez écrite pour diviser la chaîne.

Utilisez une fonction de jointure personnalisée sur l'ensemble de données résultant pour réassembler en tant que liste séparée par des virgules.

Vous pouvez maintenant utiliser une instruction UPDATE pour réécrire les données.

Questions connexes