0

ファイルから SQL ステートメントを抽出して変換するスクリプトを作成しています。gupta sqlbase データベースからアンロードされた sql を、SQLServer が理解できる sql に変換する必要があります。

1 つのタスクは、列名として許可されていないキーワードを互換性のある名前に置き換えることです。

次のコードの $commands は、SQL ステートメントを含む配列参照です。(実際にはもっとコードがありますが、ここでは関係ないので抜粋しました)

my @KeyWords = ("LEFT", "RIGHT", "PERCENT", "FILE", "PRINT", "CROSS", "PLAN", "TOP", "END", "FILE", "Default", "CHECK", "TEXT");

foreach $cmd (@$commands) {

    foreach my $kw (@KeyWords) {
        $cmd =~ s/\b$kw\b[^(]/_$kw/gi;
    }


    push @$converted, $cmd; 
}

これはほとんどのステートメントで問題なく機能しますが、次のコマンドでは の代わりに に"DEFAULT"置き換えられます。したがって、2 番目の引用符は失われます。"_DEFAULT"_DEFAULT"

  CREATE TABLE SYSADM.SUBTYPE ( ID_SUBTYPE INTEGER NOT NULL, 
  ID_TYPE INTEGER NOT NULL, 
  TYPE VARCHAR(1), 
  BEZEICH VARCHAR(60), 
  NUM_COLOR INTEGER, 
  NUM_TXTCOLOR INTEGER, 
  "DEFAULT" SMALLINT, 
  GENER_ARBA SMALLINT, 
  PROJEKTPLANUNG SMALLINT)

2 番目の引用符が削除されないように、正規表現/置換を変更する方法はありますか? それとも他の方法ですか?

4

1 に答える 1

3

[^(]左括弧ではない任意の 1 文字に一致します。

代わりに、ゼロ幅の負の先読みアサーションを使用します。

s/\b$kw\b(?!\()/_$kw/gi;

(または: (?![(]))

置換された文字を文字列に戻すこともできます。

s/\b$kw\b([^(])/_$kw$1/gi;

ただし、これはすべての場合に機能するわけではないことに注意してください。特にキーワードの後に​​何もない場合、このパターンは一致しませんが、ゼロ幅アサーションは一致します。

于 2013-08-07T11:57:23.713 に答える