sql >> Databasteknik >  >> RDS >> Sqlserver

Enkla SQL Server-funktioner för att lösa verkliga problem

Introduktion

Dagens artikel kommer från ett scenario som vi upplevde i praktiken för en tid sedan. Vi hanterade ett korttransaktionssystem som kallas Postilion, och vi var tvungna att uppdatera data i en kolumn som innehöll IP-adresser som en del av strängen med en ny IP-adress. Detta var nödvändigt eftersom IP-adressen för servern som är värd för lösningen vanligtvis skulle ändras på grund av övergång eller dataåterställning till en UAT-miljö.

Data om servern lagrades i databaserna, och det fanns inget sätt att uppdatera densamma från applikationen utan att gå rad för rad. Därför var vi tvungna att komma på en effektiv lösning med funktionerna LEN och SUBSTRING (eller ERSÄTT) SQL Server.

Återskapa miljön

För denna demonstration återger vi endast tabellen som krävs för att visa vad vi gjorde. Naturligtvis är uppgifterna inte samma som i produktionen.

Lista 1 visar hur vi skapar och fyller i vår exempeltabell:

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

Den här tabellen innehåller några enkla kolumner. Kolumnen av intresse här är adressen kolumn. Vår uppgift är att ändra IP-adressen från 10.2.100.42 till 10.2.100.79.

Som visas i figur 1 är data som lagras i adresskolumnen inte bara IP-adressen. Det är en sträng och IP-adressen är bara en del av den. Därför kan vi inte göra en enkel uppdatering. Varje rad har olika värde, och vi måste isolera den sista oktetten i IP-adressen och göra ändringen där.

Ersätt en del av en sträng i SQL Server med SUBSTRING()-funktionen

För att uppnå uppgiftskraven använder vi två enkla funktioner:LEN()-funktionen och SUBSTRING()-funktionen. Vi kommer att tillhandahålla SUBSTRING i SQL Server med exempel.

  • SQL LEN() funktion returnerar antalet tecken i en sträng. Det är viktigt för vår lösning eftersom originaldatan var något smutsig – allt i adresskolumnen var inte en IP-adress. Därför måste vi se till att uppdatera det vi tänkte uppdatera.
  • SQL-servern SUBSTRING() funktion returnerar en del av ett tecken-, binär-, text- eller bilduttryck i SQL Server. Vi använder den för att säkerställa att vi kommer att ändra den del av strängen i adresskolumnen som vi vill ändra – den faktiska IP-adressen.

Lista 2 och figur 2 visar koden för att visualisera resultatet av att ersätta .42 med .79 i adresskolumnen.

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

Obs! Vi genererade en beräknad kolumn. Därför kan vi jämföra de ursprungliga värdena med ändringarna innan vi tillämpar dessa ändringar.

Uppdatera del av en sträng i SQL med funktionen REPLACE()

Vi kunde ha gjort detta enklare genom att använda REPLACE()-funktionen. Den ersätter alla förekomster av ett specificerat strängvärde med ett annat strängvärde.

Funktionen REPLACE returnerar en sträng där den ersätter en delsträng med en annan delsträng.

Ta en titt på koden i lista 3. Vi får exakt samma resultat som visas 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

Syntax för SUBSTRING-funktion i ett UPDATE-uttalande

Låt oss visualisera vår lösning med hjälp av SELECT-satsen. Vi måste se var vi har införlivat LEN()-funktionen tillsammans med SUBSTRING()-funktionen eller den enklare REPLACE()-funktionen.

Lista 4 visar hur vi exekverar UPDATE-satsen. För säkerhets skull bifogar vi det i en transaktion. Om något är fel kan vi återställa det.

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

Om vi ​​är nöjda med resultatet förbinder vi oss helt enkelt.

Använda SQL REPLACE-funktionen i en UPDATE-sats

Vi kan uppnå samma resultat med funktionen REPLACE() i SQL (se lista 5). Detta fungerar på grund av vår specifika data, ".42" förekommer ENDAST EN GÅNG på varje rad.

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

Slutsats

Således har vi visat hur man ersätter en del av vissa strängar i kolumnen med hjälp av funktionerna SUBSTRING och REPLACE. Framgången för uppgiften beror på korrekt förståelse av de inblandade uppgifterna. Naturligtvis måste vi samarbeta med utvecklarna och specialisterna som har nödvändig erfarenhet för att förutsäga konsekvenserna av eventuella fel i en applikation.

Dessutom vidtog vi försiktighetsåtgärder:

  • Vi använde SELECT-satsen och en beräknad kolumn för att avgöra hur de slutliga resultaten skulle se ut.
  • Vi bifogade vårt UPDATE-utdrag i en transaktion för att säkerställa återställning alternativ.

Du kan gå längre med att vidta försiktighetsåtgärder och göra en säkerhetskopia av databasen:

Referenser

  1. Funktionen LEN()
  2. SUBSTRING()-funktionen
  3. Ersätt funktionen

  1. Felaktig syntax nära ''

  2. Hur kan jag få fram antalet poster som påverkas av en lagrad procedur?

  3. PostgreSQL-processnamn på Solaris

  4. Postgres-funktionen NULL-värde för rad som refererar till NEW