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

Semplici funzioni di SQL Server per risolvere i problemi del mondo reale

Introduzione

L'articolo di oggi nasce da uno scenario che abbiamo sperimentato nella pratica qualche tempo fa. Abbiamo gestito un sistema di transazione con carta denominato Postlion e abbiamo dovuto aggiornare i dati in una colonna contenente gli indirizzi IP come parte della stringa con un nuovo indirizzo IP. Ciò era necessario perché l'indirizzo IP del server che ospita la soluzione cambiava in genere a causa del passaggio o del ripristino dei dati in un ambiente UAT.

I dati sul server sono stati archiviati nei database e non c'era modo di aggiornarli dall'applicazione senza andare riga per riga. Pertanto, abbiamo dovuto trovare una soluzione efficiente utilizzando le funzioni LEN e SUBSTRING (o REPLACE) di SQL Server.

Riproduzione dell'ambiente

Per questa dimostrazione riproduciamo solo la tabella necessaria per mostrare ciò che abbiamo fatto. Naturalmente, i dati non sono gli stessi della produzione.

Il Listato 1 mostra come creiamo e riempiamo la nostra tabella di esempio:

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

Questa tabella contiene alcune semplici colonne. La colonna di interesse qui è l'indirizzo colonna. Il nostro compito è modificare l'indirizzo IP da 10.2.100.42 a 10.2.100.79.

Come mostrato nella Figura 1, i dati memorizzati nella colonna dell'indirizzo non sono solo l'indirizzo IP. È una stringa e l'indirizzo IP ne è solo una parte. Pertanto, non possiamo eseguire un semplice aggiornamento. Ogni riga ha un valore diverso e dobbiamo isolare l'ultimo ottetto dell'indirizzo IP e apportare lì la modifica.

Sostituisci parte di una stringa in SQL Server utilizzando la funzione SUBSTRING()

Per soddisfare i requisiti dell'attività, utilizziamo due semplici funzioni:la funzione LEN() e la funzione SUBSTRING(). Forniremo SUBSTRING in SQL Server con un esempio.

  • L'SQL LEN() La funzione restituisce il numero di caratteri in una stringa. È importante per la nostra soluzione perché i dati originali erano alquanto sporchi:non tutto nella colonna dell'indirizzo era un indirizzo IP. Pertanto, dobbiamo garantire l'aggiornamento di ciò che intendevamo aggiornare.
  • SQL Server SUBSTRING() La funzione restituisce una parte di un'espressione di carattere, binaria, di testo o immagine in SQL ServerSQL Server. Lo usiamo per assicurarci di cambiare quella parte della stringa nella colonna dell'indirizzo che vogliamo cambiare:l'indirizzo IP effettivo.

Il Listato 2 e la Figura 2 mostrano il codice per visualizzare il risultato della sostituzione di .42 con .79 nella colonna dell'indirizzo.

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

Nota:abbiamo generato una colonna calcolata . Pertanto, possiamo confrontare i valori originali con le modifiche prima di applicarle.

Aggiorna parte di una stringa in SQL utilizzando la funzione REPLACE()

Avremmo potuto farlo in modo più semplice usando la funzione REPLACE(). Sostituisce tutte le occorrenze di un valore stringa specificato con un altro valore stringa.

La funzione REPLACE restituisce una stringa in cui sostituisce una sottostringa con un'altra sottostringa.

Dai un'occhiata al codice nel Listato 3. Otteniamo lo stesso identico risultato mostrato nella Figura 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

Sintassi per la funzione SUBSTRING in un'istruzione UPDATE

Visualizziamo la nostra soluzione usando l'istruzione SELECT. Dobbiamo vedere dove abbiamo incorporato la funzione LEN() insieme alla funzione SUBSTRING() o alla più semplice funzione REPLACE().

Il Listato 4 mostra come eseguiamo l'istruzione UPDATE. Per sicurezza, lo racchiudiamo in una transazione. Se qualcosa non va, saremo in grado di ripristinarlo.

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

Se siamo soddisfatti dei risultati, ci impegniamo semplicemente.

Utilizzo della funzione SQL REPLACE in un'istruzione UPDATE

Possiamo ottenere gli stessi risultati usando la funzione REPLACE() in SQL (vedi Listato 5). Questo funziona a causa dei nostri dati specifici, ".42" si verifica SOLO UNA VOLTA in ogni riga.

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

Conclusione

Pertanto, abbiamo dimostrato come sostituire una parte di alcune stringhe nella colonna utilizzando le funzioni SUBSTRING e REPLACE. Il successo dell'attività dipende dalla corretta comprensione dei dati coinvolti. Ovviamente, dobbiamo collaborare con sviluppatori e specialisti che hanno l'esperienza necessaria per prevedere le implicazioni di eventuali errori in un'applicazione.

Inoltre, abbiamo preso precauzioni:

  • Abbiamo utilizzato l'istruzione SELECT e una colonna calcolata per determinare l'aspetto degli eventuali risultati.
  • Abbiamo racchiuso la nostra dichiarazione UPDATE in una transazione per garantire il rollback opzione.

Potresti andare oltre adottando misure precauzionali ed eseguire un backup del database:

Riferimenti

  1. La funzione LEN()
  2. La funzione SUBSTRING()
  3. La funzione REPLACE