sql >> Database >  >> RDS >> Sqlserver

Eenvoudige SQL Server-functies om echte problemen op te lossen

Inleiding

Het artikel van vandaag komt uit een scenario dat we enige tijd geleden in de praktijk hebben meegemaakt. We beheerden een kaarttransactiesysteem dat Postilion wordt genoemd, en we moesten de gegevens in een kolom met IP-adressen bijwerken als onderdeel van de string met een nieuw IP-adres. Dit was nodig omdat het IP-adres van de server die de oplossing host, normaal gesproken zou veranderen als gevolg van een omschakeling of het gegevensherstel naar een UAT-omgeving.

De gegevens over de server werden opgeslagen in de databases en er was geen manier om deze vanuit de applicatie bij te werken zonder rij voor rij te gaan. We moesten dus een efficiënte oplossing bedenken met behulp van de LEN- en SUBSTRING (of REPLACE) SQL Server-functies.

De omgeving reproduceren

Voor deze demonstratie reproduceren we alleen de tabel die nodig is om te laten zien wat we hebben gedaan. Natuurlijk zijn de gegevens niet hetzelfde als in productie.

Lijst 1 laat zien hoe we onze voorbeeldtabel maken en vullen:

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

Deze tabel bevat enkele eenvoudige kolommen. De interessante kolom hier is het adres kolom. Onze taak is om het IP-adres te wijzigen van 10.2.100.42 in 10.2.100.79.

Zoals weergegeven in afbeelding 1 zijn de gegevens die zijn opgeslagen in de adreskolom niet alleen het IP-adres. Het is een string en het IP-adres is er slechts een deel van. Daarom kunnen we geen eenvoudige update doen. Elke rij heeft een andere waarde en we moeten het laatste octet van het IP-adres isoleren en daar de wijziging aanbrengen.

Vervang een deel van een tekenreeks in SQL Server met de functie SUBSTRING()

Om aan de taakvereisten te voldoen, gebruiken we twee eenvoudige functies:de functie LEN() en de functie SUBSTRING(). We zullen SUBSTRING in SQL Server voorzien van een voorbeeld.

  • De SQL LEN() functie retourneert het aantal tekens in een tekenreeks. Het is belangrijk voor onze oplossing omdat de oorspronkelijke gegevens enigszins vuil waren - niet alles in de adreskolom was een IP-adres. We moeten er dus voor zorgen dat we updaten wat we wilden updaten.
  • De SQL Server SUBSTRING() functie retourneert een deel van een teken-, binaire, tekst- of afbeeldingsexpressie in SQL Server. We gebruiken het om ervoor te zorgen dat we dat deel van de tekenreeks in de adreskolom wijzigen dat we willen wijzigen:het daadwerkelijke IP-adres.

Lijst 2 en afbeelding 2 tonen de code voor het visualiseren van het resultaat van het vervangen van .42 door .79 in de adreskolom.

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

Opmerking:we hebben een berekende kolom gegenereerd. Zo kunnen we de oorspronkelijke waarden vergelijken met de wijzigingen voordat we die wijzigingen toepassen.

Een deel van een tekenreeks in SQL bijwerken met de functie REPLACE()

We hadden dit eenvoudiger kunnen doen door de functie REPLACE() te gebruiken. Het vervangt alle exemplaren van een opgegeven tekenreekswaarde door een andere tekenreekswaarde.

De REPLACE-functie retourneert een tekenreeks waarbij het een subtekenreeks vervangt door een andere subtekenreeks.

Bekijk de code in listing 3. We krijgen exact hetzelfde resultaat als in figuur 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

Syntaxis voor SUBSTRING-functie in een UPDATE-instructie

Laten we onze oplossing visualiseren met behulp van de SELECT-instructie. We moeten kijken waar we de LEN()-functie hebben opgenomen, samen met de SUBSTRING()-functie of de eenvoudigere REPLACE()-functie.

Listing 4 laat zien hoe we de UPDATE-instructie uitvoeren. Voor de veiligheid sluiten we het bij een transactie in. Als er iets mis is, kunnen we het terugdraaien.

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

Als we tevreden zijn met de resultaten, verbinden we ons gewoon.

De SQL REPLACE-functie gebruiken in een UPDATE-instructie

We kunnen dezelfde resultaten bereiken met de REPLACE()-functie in SQL (zie Lijst 5). Dit werkt vanwege onze specifieke gegevens, ".42" komt SLECHTS EENMAAL voor in elke rij.

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

Conclusie

We hebben dus laten zien hoe we een deel van sommige strings in de kolom kunnen vervangen met behulp van de functies SUBSTRING en REPLACE. Het succes van de taak hangt af van het juiste begrip van de betrokken gegevens. Natuurlijk moeten we samenwerken met de ontwikkelaars en specialisten met de nodige ervaring om de implicaties van eventuele fouten in een applicatie te voorspellen.

Daarnaast hebben we voorzorgsmaatregelen genomen:

  • We hebben de SELECT-instructie en een berekende kolom gebruikt om te bepalen hoe de uiteindelijke resultaten eruit zouden zien.
  • We hebben onze UPDATE-verklaring bij een transactie gevoegd om de terugdraaiing te garanderen optie.

U kunt verder gaan met het nemen van voorzorgsmaatregelen en een back-up van de database maken:

Referenties

  1. De LEN()-functie
  2. De SUBSTRING()-functie
  3. De REPLACE-functie

  1. Is er een verschil tussen IS NULL en =NULL?

  2. Galera-cluster bewaken voor MySQL of MariaDB - Metrics begrijpen (bijgewerkt)

  3. Hoe exporteer ik alle gegevens van een tabel naar een invoegbaar sql-formaat?

  4. Accent- en hoofdletterongevoelige sortering in Oracle met LIKE