2009-06-05 15 views
0

Sybase(それはgreeniesの90年代初期)以来、SQL Serverで作業していましたが、私はこの問題を少し悩まされています。 OracleとDB2ではSQL Server 2008:TSQL内からSQLスクリプトをロード/解析する方法は?

、あなたは、この擬似コードの例のように、その結​​果に基づいて、条件付きロジックを実行し、それを解析することができるかどうかをテストするために、ストアドプロシージャをSQLバッチまたはスクリプトを渡すことができます。

if (TrySQLParse(LoadSQLFile(filename)) == 1 
    { execute logic if parse succeeds } 
else 
    { execute logic if parse fails } 

を私は、SHOWPLANなどではなく、SQL Server 2008のシステムprocまたは同様の機能を探して、TSQLプロシージャ内から多数のスクリプトを解析し、結果に基づいて例外処理とスクリプト実行を条件付きで制御します。しかし、私はTSQLで同様の簡単なギズモを見つけることはできません。

アイデア?

+1

私は正直言ってこれを行う必要はありません。どのような状況下で、条件付きロジックはスクリプトを解析できるかどうかに依存しますか? parseable!= runnable –

答えて

0

あなたは、EXEC()を呼び出し、文字列としてスクリプトに渡し、これを行うには、SQL Serverのメカニズムはありませんのtry/catch

+0

あなたはドローに私を打つ;) –

+1

と一緒に 'SET FMTONLY'? –

+0

eeehhh、CLRオプションのように、EXECが実行する可能性があるのは、 –

0

でそれをラップすることができます。あなたはCLRコンポーネントとSMOでそれを行うことができるかもしれませんが、疑わしい利益のための多くの仕事のように思えます。

try/catchブロックでスクリプトをラップし、catchブロックで「if fails」コードを実行する方法はありますか?

+0

構文エラーをキャッチするとは思わない –

0

潜在的に非常に危険です。 Googleは "SQLインジェクション"をアップし、あなたのために参照してください。

+0

運用コードではなく、ops/adminスクリプトで完全に使用されています。 sysdbaのコントロールとにアクセスできます。問題ありません。 –

1

実行前に完全な解析/コンパイルを行う技術でこれを行う一般的な方法は、問題のコードの前に実行を停止させるものを追加することです。たとえば、VBScriptのは、実際にそれを実行せずに構文チェックをパスかどうかを確認するために、私が先頭に追加:

Wscript.exit(1) 

いずれかが存在する場合、私は構文エラーを参照するか、何も存在しないならば、最初のアクションが終了することである。この方法をスクリプトを実行し、残りのコードを無視します。

私はSQL世界でアナログは、重大度の高いエラーを発生させることだと思います。重大度20+を使用すると接続が切断されるため、スクリプトに複数のバッチがある場合はすべてスキップされます。私は100.00000%SQLインジェクションの何らかの種類がこの前に付いたエラーを過ぎることができないことを確認することはできませんが、私はそこにある可能性がある方法を見ることができません。例では、問題のコードブロックの前でこれを固執することです:

raiserror ('syntax checking, disregard error', 20, 1) with log 

構文エラーからだから、このエラーが出:このエラーながら

raiserror ('syntax checking, disregard error', 20, 1) with log 
create table t1() 
go 
create table t2() 
go 

アウトランタイムエラー(およびT1から/ T2は作成されません)

raiserror ('syntax checking, disregard error', 20, 1) with log 
create table t1(i int) 
go 
create table t2(i int) 
go 

そして、あなたのオプションを仕上げるために、あなたは、アセンブリC参照することができます:の\ Program Files \ Microsoft SQL Serverは\ 100の\ツール\ Binnの\ VSShell \ Common7 \ IDE \ Microsoft.SqlServerを。 SqlParser.dl lはdbの外部のclrユーティリティで、次のようになります。

SqlScript script = Parser.Parse(@"create proc sp1 as select 'abc' as abc1"); 
+0

申し訳ありませんが、私はこれを行うCLR関数を書くつもりだと思います。 Thx Hainstech –

関連する問題