Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Einfache SQL Server-Funktionen zur Lösung realer Probleme

Einführung

Der heutige Artikel stammt aus einem Szenario, das wir vor einiger Zeit in der Praxis erlebt haben. Wir verwalteten ein Kartentransaktionssystem namens Postilion und mussten die Daten in einer Spalte mit IP-Adressen als Teil der Zeichenfolge mit einer neuen IP-Adresse aktualisieren. Dies war notwendig, da sich die IP-Adresse des Servers, auf dem die Lösung gehostet wird, normalerweise aufgrund der Umstellung oder der Datenwiederherstellung auf eine UAT-Umgebung ändert.

Die Daten über den Server wurden in den Datenbanken gespeichert, und es gab keine Möglichkeit, sie von der Anwendung aus zu aktualisieren, ohne Zeile für Zeile zu gehen. Daher mussten wir eine effiziente Lösung mit den SQL Server-Funktionen LEN und SUBSTRING (oder REPLACE) finden.

Wiedergabe der Umgebung

Für diese Demonstration reproduzieren wir nur die Tabelle, die erforderlich ist, um zu zeigen, was wir getan haben. Natürlich sind die Daten nicht die gleichen wie in der Produktion.

Listing 1 zeigt, wie wir unsere Beispieltabelle erstellen und füllen:

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

Diese Tabelle enthält einige einfache Spalten. Die interessante Spalte hier ist die Adresse Säule. Unsere Aufgabe ist es, die IP-Adresse von 10.2.100.42 auf 10.2.100.79 zu ändern.

Wie in Abbildung 1 gezeigt, handelt es sich bei den in der Adressspalte gespeicherten Daten nicht nur um die IP-Adresse. Es ist eine Zeichenfolge, und die IP-Adresse ist nur ein Teil davon. Daher können wir kein einfaches Update durchführen. Jede Zeile hat einen anderen Wert, und wir müssen das letzte Oktett der IP-Adresse isolieren und dort die Änderung vornehmen.

Ersetzen Sie einen Teil einer Zeichenfolge in SQL Server mit der Funktion SUBSTRING()

Um die Aufgabenanforderungen zu erfüllen, verwenden wir zwei einfache Funktionen:die LEN()-Funktion und die SUBSTRING()-Funktion. Wir werden SUBSTRING in SQL Server mit Beispiel bereitstellen.

  • Die SQL LEN() Die Funktion gibt die Anzahl der Zeichen in einer Zeichenfolge zurück. Es ist wichtig für unsere Lösung, weil die ursprünglichen Daten etwas unsauber waren – nicht alles in der Adressspalte war eine IP-Adresse. Daher müssen wir sicherstellen, dass das aktualisiert wird, was wir aktualisieren wollten.
  • Der SQL-Server SUBSTRING() Die Funktion gibt einen Teil eines Zeichen-, Binär-, Text- oder Bildausdrucks in SQL Server zurück. Wir verwenden es, um sicherzustellen, dass wir den Teil der Zeichenfolge in der Adressspalte ändern, den wir ändern möchten – die tatsächliche IP-Adresse.

Listing 2 und Abbildung 2 zeigen den Code zur Visualisierung des Ergebnisses des Ersetzens von .42 durch .79 in der Adressspalte.

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

Hinweis:Wir haben eine berechnete Spalte generiert. Daher können wir die ursprünglichen Werte mit den Änderungen vergleichen, bevor wir diese Änderungen anwenden.

Teil eines Strings in SQL mit der REPLACE()-Funktion aktualisieren

Wir hätten dies einfacher machen können, indem wir die Funktion REPLACE() verwendet hätten. Es ersetzt alle Vorkommen eines angegebenen Zeichenfolgenwerts durch einen anderen Zeichenfolgenwert.

Die REPLACE-Funktion gibt eine Zeichenfolge zurück, in der sie eine Teilzeichenfolge durch eine andere Teilzeichenfolge ersetzt.

Schauen Sie sich den Code in Listing 3 an. Wir erhalten genau das gleiche Ergebnis wie in Abbildung 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 die SUBSTRING-Funktion in einer UPDATE-Anweisung

Lassen Sie uns unsere Lösung mit der SELECT-Anweisung visualisieren. Wir müssen sehen, wo wir die LEN()-Funktion zusammen mit der SUBSTRING()-Funktion oder der einfacheren REPLACE()-Funktion eingebaut haben.

Listing 4 zeigt, wie wir die UPDATE-Anweisung ausführen. Aus Sicherheitsgründen schließen wir es in eine Transaktion ein. Wenn etwas nicht stimmt, können wir es rückgängig machen.

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

Wenn wir mit den Ergebnissen zufrieden sind, legen wir einfach fest.

Verwenden der SQL REPLACE-Funktion in einer UPDATE-Anweisung

Die gleichen Ergebnisse erzielen wir mit der Funktion REPLACE() in SQL (siehe Listing 5). Dies funktioniert aufgrund unserer spezifischen Daten, „.42“ kommt NUR EINMAL in jeder Zeile vor.

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

Schlussfolgerung

So haben wir demonstriert, wie man einen Teil einiger Strings in der Spalte mit den Funktionen SUBSTRING und REPLACE ersetzt. Der Erfolg der Aufgabe hängt vom richtigen Verständnis der beteiligten Daten ab. Natürlich müssen wir mit den Entwicklern und Spezialisten zusammenarbeiten, die über die notwendige Erfahrung verfügen, um die Auswirkungen von Fehlern in einer Anwendung vorherzusagen.

Außerdem haben wir Vorkehrungen getroffen:

  • Wir haben die SELECT-Anweisung und eine berechnete Spalte verwendet, um zu bestimmen, wie die endgültigen Ergebnisse aussehen würden.
  • Wir haben unsere UPDATE-Anweisung in eine Transaktion eingeschlossen, um das Rollback sicherzustellen Möglichkeit.

Sie können weitere Vorsichtsmaßnahmen treffen und eine Sicherungskopie der Datenbank erstellen:

Referenzen

  1. Die LEN()-Funktion
  2. Die SUBSTRING()-Funktion
  3. Die REPLACE-Funktion