sql >> データベース >  >> RDS >> Sqlserver

現実世界の問題を解決するための単純なSQLServer関数

    はじめに

    今日の記事は、私たちが以前に実際に経験したシナリオからのものです。ポスティリオンと呼ばれるカード取引システムを管理しており、文字列の一部としてIPアドレスを含む列のデータを新しいIPアドレスで更新する必要がありました。これが必要だったのは、ソリューションをホストしているサーバーのIPアドレスは、通常、スイッチオーバーまたはUAT環境へのデータの復元によって変更されるためです。

    サーバーに関するデータはデータベースに保存されており、行ごとに移動せずにアプリケーションから同じデータを更新する方法はありませんでした。したがって、LENおよびSUBSTRING(またはREPLACE)SQLServer関数を使用して効率的なソリューションを考え出す必要がありました。

    環境の再現

    このデモンストレーションでは、私たちが行ったことを示すために必要な表のみを再現します。もちろん、データは本番環境と同じではありません。

    リスト1は、サンプルテーブルを作成してデータを入力する方法を示しています。

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

    このテーブルには、いくつかの単純な列が含まれています。ここで関心のある列はアドレスです 桁。私たちのタスクは、IPアドレスを10.2.100.42から10.2.100.79に変更することです。

    図1に示すように、アドレス列に格納されているデータはIPアドレスだけではありません。これは文字列であり、IPアドレスはその一部にすぎません。したがって、単純な更新を行うことはできません。各行には異なる値があり、IPアドレスの最後のオクテットを分離してそこで変更する必要があります。

    SUBSTRING()関数を使用してSQLServerの文字列の一部を置き換える

    タスク要件を達成するために、LEN()関数とSUBSTRING()関数の2つの単純な関数を使用します。例を挙げてSQLServerでSUBSTRINGを提供します。

    • SQL LEN() 関数は、文字列の文字数を返します。元のデータがやや汚れていたため、このソリューションにとって重要です。アドレス列のすべてがIPアドレスであるとは限りません。したがって、更新しようとしたものを確実に更新する必要があります。
    • SQL Server SUBSTRING() 関数は、SQL Serverの文字、バイナリ、テキスト、または画像式の一部を返します。これを使用して、変更するアドレス列の文字列の部分、つまり実際のIPアドレスを確実に変更します。

    リスト2と図2は、アドレス列で.42を.79に置き換えた結果を視覚化するためのコードを示しています。

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

    注:計算列を生成しました。 したがって、変更を適用する前に、元の値と変更を比較できます。

    REPLACE()関数を使用してSQLの文字列の一部を更新する

    REPLACE()関数を使用することで、これをより簡単に行うことができます。指定された文字列値のすべての出現箇所を別の文字列値に置き換えます。

    REPLACE関数は、部分文字列を別の部分文字列に置き換える文字列を返します。

    リスト3のコードを見てください。図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
    

    UPDATEステートメントのSUBSTRING関数の構文

    SELECTステートメントを使用してソリューションを視覚化してみましょう。 LEN()関数をSUBSTRING()関数またはより簡単なREPLACE()関数と一緒にどこに組み込んだかを確認する必要があります。

    リスト4は、UPDATEステートメントを実行する方法を示しています。安全のため、トランザクションに同封します。何か問題がある場合は、ロールバックできます。

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

    結果に満足したら、コミットするだけです。

    UPDATEステートメントでのSQLREPLACE関数の使用

    SQLのREPLACE()関数を使用して同じ結果を得ることができます(リスト5を参照)。これは、特定のデータのために機能します。「。42」は、各行で1回だけ発生します。

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

    結論

    したがって、SUBSTRING関数とREPLACE関数を使用して、列内の一部の文字列の一部を置き換える方法を示しました。タスクの成功は、関連するデータの適切な理解に依存します。もちろん、アプリケーションのエラーの影響を予測するために必要な経験を持つ開発者やスペシャリストと協力する必要があります。

    さらに、予防策を講じました:

    • SELECTステートメントと計算列を使用して、最終的な結果がどのようになるかを判断しました。
    • ロールバックを確実にするために、UPDATEステートメントをトランザクションで囲みました オプション。

    さらに予防策を講じて、データベースのバックアップを作成することもできます。

    参考資料

    1. LEN()関数
    2. SUBSTRING()関数
    3. REPLACE関数

    1. C#:オブジェクトをDbNullから他のタイプにキャストすることはできません

    2. MySQLとMariaDBの6つの一般的な障害シナリオ、およびそれらを修正する方法

    3. SQLServerインスタンスでサポートされているデータベース照合を見つける方法

    4. SQLite AVG