Úvod
Dnešní článek pochází ze scénáře, který jsme před časem zažili v praxi. Spravovali jsme systém karetních transakcí označovaný jako Postilion a museli jsme aktualizovat data ve sloupci obsahujícím IP adresy jako součást řetězce novou IP adresou. To bylo nutné, protože IP adresa serveru hostujícího řešení se obvykle změnila v důsledku přechodu nebo obnovení dat do prostředí UAT.
Data o serveru byla uložena v databázích a neexistoval způsob, jak je aktualizovat z aplikace bez procházení řádek po řádku. Museli jsme tedy přijít s efektivním řešením pomocí funkcí LEN a SUBSTRING (nebo REPLACE) SQL Server.
Reprodukce prostředí
Pro tuto demonstraci reprodukujeme pouze tabulku potřebnou k tomu, abychom ukázali, co jsme udělali. Data samozřejmě nejsou stejná jako ve výrobě.
Výpis 1 ukazuje, jak vytváříme a naplňujeme naši ukázkovou tabulku:
-- 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');
Tato tabulka obsahuje několik jednoduchých sloupců. Sloupec zájmu je zde adresa sloupec. Naším úkolem je změnit IP adresu z 10.2.100.42 na 10.2.100.79.
Jak je znázorněno na obrázku 1, data uložená ve sloupci adresy nejsou pouze adresou IP. Je to řetězec a IP adresa je pouze jeho částí. Proto nemůžeme provést jednoduchou aktualizaci. Každý řádek má jinou hodnotu a my musíme izolovat poslední oktet IP adresy a provést změnu tam.
Nahradit část řetězce v SQL Server pomocí funkce SUBSTRING()
K dosažení požadavků úlohy používáme dvě jednoduché funkce:funkci LEN() a funkci SUBSTRING(). SUBSTRING na SQL Serveru poskytneme příklad.
- SQL LEN() Funkce vrací počet znaků v řetězci. Pro naše řešení je to důležité, protože původní data byla poněkud špinavá – ne vše ve sloupci adresy byla IP adresa. Proto musíme zajistit aktualizaci toho, co jsme chtěli aktualizovat.
- Server SQL SUBSTRING() Funkce vrací část znakového, binárního, textového nebo obrázkového výrazu na serveru SQL Server. Používáme jej k zajištění toho, že změníme tu část řetězce ve sloupci adresy, kterou chceme změnit – skutečnou IP adresu.
Výpis 2 a obrázek 2 ukazují kód pro vizualizaci výsledku nahrazení .42 za .79 ve sloupci adresy.
-- 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
Poznámka:Vygenerovali jsme počítaný sloupec. Můžeme tedy porovnat původní hodnoty se změnami, než tyto změny použijeme.
Aktualizujte část řetězce v SQL pomocí funkce REPLACE()
Mohli jsme to udělat jednodušeji pomocí funkce REPLACE(). Nahradí všechny výskyty zadané řetězcové hodnoty jinou řetězcovou hodnotou.
Funkce REPLACE vrátí řetězec, kde nahradí podřetězec jiným podřetězcem.
Podívejte se na kód ve výpisu 3. Dostaneme přesně stejný výsledek jako na obrázku 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 funkce SUBSTRING v příkazu UPDATE
Pojďme si naše řešení vizualizovat pomocí příkazu SELECT. Musíme se podívat, kam jsme začlenili funkci LEN() spolu s funkcí SUBSTRING() nebo jednodušší funkcí REPLACE().
Výpis 4 ukazuje, jak provádíme příkaz UPDATE. Pro jistotu to přikládáme k transakci. Pokud je něco v nepořádku, budeme to moci vrátit zpět.
-- 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
Pokud jsme s výsledky spokojeni, jednoduše se zavážeme.
Použití funkce SQL REPLACE v příkazu UPDATE
Stejných výsledků můžeme dosáhnout pomocí funkce REPLACE() v SQL (viz Výpis 5). Toto funguje díky našim specifickým údajům, „.42“ se vyskytuje POUZE JEDNOU v každém řádku.
-- 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
Závěr
Ukázali jsme si tedy, jak nahradit část některých řetězců ve sloupci pomocí funkcí SUBSTRING a REPLACE. Úspěch úkolu závisí na správném pochopení příslušných dat. Samozřejmě musíme spolupracovat s vývojáři a specialisty, kteří mají potřebné zkušenosti, abychom mohli předvídat důsledky jakýchkoli chyb v aplikaci.
Kromě toho jsme přijali opatření:
- Použili jsme příkaz SELECT a vypočítaný sloupec, abychom určili, jak budou vypadat případné výsledky.
- K transakci jsme připojili prohlášení UPDATE, abychom zajistili vrácení zpět volba.
Můžete zajít dále v přijímání preventivních opatření a zálohovat databázi:
Odkazy
- Funkce LEN()
- Funkce SUBSTRING()
- Funkce REPLACE