sql >> Database teknologi >  >> RDS >> Sqlserver

Simple SQL Server-funktioner til at løse problemer i den virkelige verden

Introduktion

Dagens artikel stammer fra et scenarie, vi oplevede i praksis for noget tid siden. Vi administrerede et korttransaktionssystem kaldet Postilion, og vi skulle opdatere dataene i en kolonne med IP-adresser som en del af strengen med en ny IP-adresse. Dette var nødvendigt, fordi IP-adressen på serveren, der hostede løsningen, typisk ville ændre sig på grund af omstilling eller datagendannelse til et UAT-miljø.

Dataene om serveren blev gemt i databaserne, og der var ingen måde at opdatere det samme fra applikationen uden at gå række for række. Derfor var vi nødt til at finde en effektiv løsning ved hjælp af LEN og SUBSTRING (eller REPLACE) SQL Server-funktionerne.

Gengivelse af miljøet

Til denne demonstration gengiver vi kun den tabel, der kræves for at vise, hvad vi gjorde. Dataene er naturligvis ikke de samme som i produktionen.

Liste 1 viser, hvordan vi opretter og udfylder vores eksempeltabel:

-- 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');

Denne tabel indeholder nogle få enkle kolonner. Den interessante kolonne her er adressen kolonne. Vores opgave er at ændre IP-adressen fra 10.2.100.42 til 10.2.100.79.

Som vist i figur 1 er de data, der er gemt i adressekolonnen, ikke kun IP-adressen. Det er en streng, og IP-adressen er kun en del af den. Derfor kan vi ikke lave en simpel opdatering. Hver række har en forskellig værdi, og vi skal isolere den sidste oktet af IP-adressen og foretage ændringen der.

Erstat en del af en streng i SQL Server ved hjælp af SUBSTRING()-funktionen

For at opnå opgavekravene bruger vi to simple funktioner:LEN()-funktionen og SUBSTRING()-funktionen. Vi vil give SUBSTRING i SQL Server med et eksempel.

  • SQL'en LEN() funktion returnerer antallet af tegn i en streng. Det er vigtigt for vores løsning, fordi de oprindelige data var noget beskidte – ikke alt i adressekolonnen var en IP-adresse. Derfor skal vi sørge for at opdatere det, vi havde til hensigt at opdatere.
  • SQL-serveren SUBSTRING() funktion returnerer en del af et tegn-, binær-, tekst- eller billedudtryk i SQL Server. Vi bruger det til at sikre, at vi ændrer den del af strengen i adressekolonnen, som vi vil ændre – den faktiske IP-adresse.

Liste 2 og figur 2 viser koden til visualisering af resultatet af at erstatte .42 med .79 i adressekolonnen.

-- 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

Bemærk:Vi genererede en beregnet kolonne. Således kan vi sammenligne de oprindelige værdier med ændringerne, før vi anvender disse ændringer.

Opdater del af en streng i SQL ved hjælp af REPLACE()-funktionen

Vi kunne have gjort dette enklere ved at bruge REPLACE()-funktionen. Den erstatter alle forekomster af en specificeret strengværdi med en anden strengværdi.

Funktionen REPLACE returnerer en streng, hvor den erstatter en understreng med en anden understreng.

Tag et kig på koden i liste 3. Vi får nøjagtig det samme resultat som vist i figur 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

Syntaks for SUBSTRING-funktion i en UPDATE-erklæring

Lad os visualisere vores løsning ved hjælp af SELECT-sætningen. Vi skal se, hvor vi har inkorporeret LEN()-funktionen sammen med SUBSTRING()-funktionen eller den nemmere REPLACE()-funktion.

Liste 4 viser, hvordan vi udfører UPDATE-sætningen. For en sikkerheds skyld vedlægger vi det i en transaktion. Hvis der er noget galt, vil vi være i stand til at rulle det tilbage.

-- 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

Hvis vi er tilfredse med resultaterne, forpligter vi os simpelthen.

Brug af SQL REPLACE-funktionen i en UPDATE-sætning

Vi kan opnå de samme resultater ved at bruge REPLACE()-funktionen i SQL (se liste 5). Dette virker på grund af vores specifikke data, ".42" forekommer KUN EN gang i hver række.

-- 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

Konklusion

Vi har således demonstreret, hvordan man erstatter en del af nogle strenge i kolonnen ved hjælp af funktionerne SUBSTRING og REPLACE. Opgavens succes afhænger af den korrekte forståelse af de involverede data. Selvfølgelig skal vi samarbejde med udviklerne og specialisterne, der har den nødvendige erfaring til at forudsige konsekvenserne af eventuelle fejl i en applikation.

Derudover tog vi forholdsregler:

  • Vi brugte SELECT-sætningen og en beregnet kolonne til at bestemme, hvordan de endelige resultater ville se ud.
  • Vi vedlagde vores UPDATE-erklæring i en transaktion for at sikre tilbageføring mulighed.

Du kan gå længere med at tage forholdsregler og lave en sikkerhedskopi af databasen:

Referencer

  1. Funktionen LEN()
  2. SUBSTRING()-funktionen
  3. Erstatningsfunktionen

  1. Søg efter en værdi i kolonneværdien, der gemmer kommaseparerede værdier

  2. XAMPP - MySQL lukning uventet

  3. PostgreSQL, kompleks forespørgsel til beregning af ingredienser efter opskrift

  4. DBTIMEZONE-funktion i Oracle