2017-06-26 63 views
-1

我有很多很長的sql文件,其中包括一堆離散的sql命令。基本上這些文件會丟失,然後通過一些修改重新創建一堆存儲過程。針對SQL腳本的Perl解析

我需要解析出來,以獲得單個降/創建scrips。

Perl是我的第一選擇,因爲它是擅長解析......但我不是很有經驗的Perl ...

這裏是我到目前爲止(請注意我基本上重新寫我的原未遂):

#!/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); 

我解析文本看起來像:

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

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

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

這給我的文件命名爲1,2,3,等在他們離散的存儲過程。我不得不做一些奇怪的補充,並用文本取代它來正確...但它的工作原理。最後一個文件將以一個額外的「;」結尾但是...應該是安全的。

主要的問題我現在是,第一檔是因爲我的「DROP PROCEDURE」解析的方式空。我試圖通過在while循環中放入一個if/else來處理這個問題,除了設置n ++之外,如果n = 0,它將不會執行任何操作;

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

,但是這隻創建了一個文件(名爲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: $!"; 

這按摩它創建成我們的自動存儲過程執行喜歡和格式的各個文件名有問題的存儲過程後的文件。

+0

'$ row ='DROP PROCEDURE'。 $行。 ';' #確保將DROP PROCEDURE置於 $ row =〜s/DROP PROCEDURE // g; #我們不希望正則表達式餓了 – bytepusher