2017-06-26 17 views
-1

私は、一連の個別のSQLコマンドを含む多くの長いsqlファイルを持っています。基本的に、ファイルはいくつかの変更を加えて一連のストアドプロシージャを削除してから再作成します。SQLスクリプトのPerl解析

個々のドロップ/作成スクリプトを取得するには、それらを解析する必要があります。

Perlは、それはパースで良いですので、私の最初の選択肢です...しかし、私は非常にPerlで経験していないよ...

ここで私はこれまでのところ(私は、実質的に再書いた私の元に注意しているものです試行):これは私がそれらで離散ストアドプロシージャで、などを1、2、3という名前のファイル与え

Use mydatabase; 
GO 
Drop Procedure [blah1] 
Create Procedure [blah1] 
[Sql stuff] 

Drop Procedure [blah2] 
Create Procedure [blah2] 
[Sql stuff] 

[repeat blah3....blah4...etc...etc..] 

#!/usr/bin/perl 
use strict; 
use warnings; 

my $use = ""; 
my $use = "USE mydatabase;"; 

undef $/;    # Enable 'slurp' mode 
open my $fh, '<', 'AlterSprocs.sql' or die; 
$/= 'DROP PROCEDURE'; 
while (my $row = <$fh>) { 
$n ++; 
$row = $use . "\n" . "GO" . "\n" . 'DROP PROCEDURE' . $row . ';'; 
my $find = 'DROP PROCEDURE;'; 
my $replace = ""; 
$row =~ s/$find/$replace/g; 

open (MYFILE, '>', $n); 
print MYFILE $row; 
close (MYFILE); 

私が解析していたテキストは次のように見えます。私はいくつかの奇妙な追加をしなければならなかったし、それを正しくするためにテキストで置き換え...それは動作します。最後のファイルは余分な ";"しかし...それは安全でなければならない。

私が今持っている主な問題は、最初のファイルが空であるということです。なぜなら、私は「ドロッププロシージャ」を解析しているからです。私はこれを処理することを試みたif/else whileループでは、n ++を設定する以外にn = 0なら何もしません。

if ($n = 0) 
{$n++;} 
else {all the other stuff I actually want to do} 

しかし、これは1つのファイル(名前が1)のみを作成しました。

$ nの代わりに出力ファイルに名前を付けるために、ストアドプロシージャの名前を引き出す必要がありますが、最初の行であるため、やや単純です。

+0

あなたの投稿に含まれているスクリプトから表示する出力を得る方法はないようです。 –

+0

PerlはPerlを知っていれば解析するだけです!そうでなければ、あなたが知っている言語でより生産的になるでしょう。 –

+1

私は複数の試合で反復を試みることさえありません。 –

答えて

0

私は私が始めたところから、かなり異なる解決策になってしまった:

#!/usr/bin/perl 
use strict; 
use warnings; 


my $file_name = ""; 
my $first_line = ""; 

undef $/;    # Enable 'slurp' mode 

open my $fh, '<', 'AlterSprocs.sql' or die; 


$/= 'DROP PROCEDURE'; 
while (my $row = <$fh>) { 

{ 
$n ++; 
if ($row =~ /\[dbo].\[(.*?)\]/) 
{ 
$file_name = $1; 
$row = 'DROP PROCEDURE' . $row . ';'; 
my $find = 'DROP PROCEDURE;'; 
my $replace = ""; 
$row =~ s/$find/$replace/g; 
$first_line = 'IF EXISTS (SELECT 1 FROM sysobjects with(nolock) WHERE id = OBJECT_ID(N\'[dbo].[' . $file_name . ']\'))' . "\n"; 
open (MYFILE, '>', "dbo." . $file_name . ".prc"); 
print MYFILE $first_line; 
print MYFILE $row; 
close (MYFILE); 
} 
} 

close $fh or die "Could not close sample.txt: $!"; 

をこのマッサージそれは私たちの自動化のSPROCエグゼキュータの同類と名問題のストアドプロシージャの後のファイル形式に作成し、個々のファイル。

+0

'$ row = 'DROP PROCEDURE'。 $行。 ';' #DROP PROCEDURE INを必ず入れてください。 $ row =〜s/DROP PROCEDURE // g; #私たちは正規表現が空腹になるのを望んでいないだろう – bytepusher