Présentation
L'article d'aujourd'hui provient d'un scénario que nous avons expérimenté il y a quelque temps. Nous avons géré un système de transaction par carte appelé Postilion, et nous avons dû mettre à jour les données dans une colonne contenant des adresses IP dans le cadre de la chaîne avec une nouvelle adresse IP. Cela était nécessaire car l'adresse IP du serveur hébergeant la solution changeait généralement en raison du basculement ou de la restauration des données dans un environnement UAT.
Les données sur le serveur étaient stockées dans les bases de données et il n'y avait aucun moyen de les mettre à jour à partir de l'application sans aller ligne par ligne. Ainsi, nous avons dû trouver une solution efficace en utilisant les fonctions SQL Server LEN et SUBSTRING (ou REPLACE).
Reproduire l'environnement
Pour cette démonstration, nous reproduisons uniquement le tableau nécessaire pour montrer ce que nous avons fait. Bien sûr, les données ne sont pas les mêmes qu'en production.
La liste 1 montre comment nous créons et remplissons notre exemple de table :
-- Listing 1: Create and Populate Node_Saps Table
create database postilion;
use postilion
go
-- drop table node_saps
create table node_saps (
[node] varchar(50)
,[sap] varchar(50)
,[type] varchar(50)
,[protocol] varchar(50)
,[address] varchar(50)
,[setup_data] varchar(50)
,[secure] varchar(50)
,[max_nr_conn] varchar(50)
,[msg_mode] varchar(50)
,[nr_active_conns] varchar(50)
,[filter_properties] varchar(50)
)
use postilion
go
insert into node_saps values ('EGH01',2,'sink','TCP','10.2.100.42_atm_ghana', 100,'YES',10,'open',5,'intense');
insert into node_saps values ('EGH02',3,'sink','TCP','10.2.100.42_atm_ghana', 120,'YES',10,'open',5,'moderate');
insert into node_saps values ('ENG01',4,'source','TCP','10.2.100.42_atm_nigeria', 175,'YES',40,'open',19,'premium');
insert into node_saps values ('EBF01',6,'sink','TCP','10.2.100.42_atm_burkina', 122,'YES',20,'open',4,'intense');
insert into node_saps values ('EGQ01',7,'sink','TCP','10.2.100.42_atm_equatorial', 200,'YES',10,'open',2,'moderate');
Ce tableau contient quelques colonnes simples. La colonne qui nous intéresse ici est l'adresse colonne. Notre tâche consiste à changer l'adresse IP de 10.2.100.42 à 10.2.100.79.
Comme le montre la figure 1, les données stockées dans la colonne d'adresse ne sont pas l'adresse IP seule. C'est une chaîne, et l'adresse IP n'en est qu'une partie. Par conséquent, nous ne pouvons pas faire une simple mise à jour. Chaque ligne a une valeur différente, et nous devons isoler le dernier octet de l'adresse IP et y apporter la modification.
Remplacer une partie d'une chaîne dans SQL Server à l'aide de la fonction SUBSTRING()
Pour répondre aux exigences de la tâche, nous utilisons deux fonctions simples :la fonction LEN() et la fonction SUBSTRING(). Nous fournirons SUBSTRING dans SQL Server avec exemple.
- Le SQL LEN() La fonction renvoie le nombre de caractères d'une chaîne. C'est important pour notre solution car les données d'origine étaient quelque peu sales - tout dans la colonne d'adresse n'était pas une adresse IP. Ainsi, nous devons nous assurer de mettre à jour ce que nous avions l'intention de mettre à jour.
- Le serveur SQL SUBSTRING() La fonction renvoie une partie d'une expression de caractère, binaire, texte ou image dans SQL Server. Nous l'utilisons pour nous assurer que nous modifierons la partie de la chaîne dans la colonne d'adresse que nous souhaitons modifier :l'adresse IP réelle.
Le Listing 2 et la Figure 2 montrent le code permettant de visualiser le résultat du remplacement de .42 par .79 dans la colonne d'adresse.
-- Listing 2: Select Statement to Verify Solution
USE postilion
GO
SELECT [node]
,[sap]
,[type]
,[protocol]
,[address]
,substring (address,1,9) + '79' + substring (address,12,20) manrep
,[setup_data]
,[secure]
,[max_nr_conn]
,[msg_mode]
,[nr_active_conns]
,[filter_properties]
FROM [postilion].[dbo].[node_saps]
WHERE len(address) > 10
Remarque :Nous avons généré une colonne calculée . Ainsi, nous pouvons comparer les valeurs d'origine avec les modifications avant d'appliquer ces modifications.
Mettre à jour une partie d'une chaîne en SQL à l'aide de la fonction REPLACE()
Nous aurions pu faire cela plus simplement en utilisant la fonction REPLACE(). Il remplace toutes les occurrences d'une valeur de chaîne spécifiée par une autre valeur de chaîne.
La fonction REPLACE renvoie une chaîne où elle remplace une sous-chaîne par une autre sous-chaîne.
Jetez un œil au code du Listing 3. Nous obtenons exactement le même résultat que celui illustré à la Figure 2.
-- Listing 3: Select Statement to Verify Solution Using REPLACE()
USE postilion
GO
SELECT [node]
,[sap]
,[type]
,[protocol]
,[address]
,replace(address,'.42','.79') rep
,[setup_data]
,[secure]
,[max_nr_conn]
,[msg_mode]
,[nr_active_conns]
,[filter_properties]
FROM [postilion].[dbo].[node_saps]
WHERE len(address) > 10
Syntaxe pour la fonction SUBSTRING dans une instruction UPDATE
Visualisons notre solution à l'aide de l'instruction SELECT. Nous devons voir où nous avons incorporé la fonction LEN() avec la fonction SUBSTRING() ou la fonction REPLACE() plus simple.
Le Listing 4 montre comment nous exécutons l'instruction UPDATE. Par sécurité, nous l'incluons dans une transaction. Si quelque chose ne va pas, nous pourrons l'annuler.
-- Listing 4: UPDATE Statement Using SUBSTRING()
BEGIN TRAN
update [postilion].[dbo].[node_saps]
set address=substring (address,1,9) + '79' + substring (address,12,20)
where substring (address,10,2)= '42' and
len(address) > 10
SELECT * FROM [postilion].[dbo].[node_saps]
--ROLLBACK
--COMMIT
Si nous sommes satisfaits des résultats, nous nous engageons simplement.
Utilisation de la fonction SQL REPLACE dans une instruction UPDATE
Nous pouvons obtenir les mêmes résultats en utilisant la fonction REPLACE() en SQL (voir Listing 5). Cela fonctionne grâce à nos données spécifiques, ".42" apparaît UNE SEULE FOIS dans chaque ligne.
-- Listing 5: UPDATE Statement Using REPLACE()
BEGIN TRAN
update [postilion].[dbo].[node_saps]
set address=replace(address,'.42','.79')
where substring (address,10,2)= '42' and
len(address) > 10
SELECT * FROM [postilion].[dbo].[node_saps]
--ROLLBACK
--COMMIT
Conclusion
Ainsi, nous avons montré comment remplacer une partie de certaines chaînes dans la colonne à l'aide des fonctions SUBSTRING et REPLACE. Le succès de la tâche dépend de la bonne compréhension des données impliquées. Bien sûr, nous devons collaborer avec les développeurs et les spécialistes ayant l'expérience nécessaire pour prévoir les implications de toute erreur dans une application.
De plus, nous avons pris des précautions :
- Nous avons utilisé l'instruction SELECT et une colonne calculée pour déterminer à quoi ressembleraient les résultats éventuels.
- Nous avons inclus notre instruction UPDATE dans une transaction pour assurer le rollback option.
Vous pouvez aller plus loin en prenant des mesures de précaution et faire une sauvegarde de la base de données :
Références
- La fonction LEN()
- La fonction SUBSTRING()
- La fonction REMPLACER