5

テーブルや列の名前を変更し、その他の複雑なロジックを持つデータポート スクリプトを作成することがあります。これらの古い列またはテーブルを参照する IF ステートメントにも SQL があります。IF ステートメントを使用して、SQL スクリプトを複数実行しやすいようにするための標準があります。

ただし、場合によっては、if ステートメントが false と評価されても、ブロックにラップされたコードでエラーが発生することがあります。これは、構文チェックが原因であると推測されます。

if 1 = 0
begin

   select * from mydatabase.dbo.mytable; -- doesn't execute, but still errors because doesn't exist

end

もう1つの奇妙なことは、常に一貫しているわけではなく、うまく機能することもあります。

スクリプトごとにこれらの種類のチェックを無効にする方法があるかどうかは誰にもわかりません。

ありがとう

ノート

同様の状況を試してみたが、エラーは発生しなかったと人々が言うことは知っています。最初はSSMSではエラーになりませんでしたが、SQLCMDではエラーになりました。

sqlcmd MyTestScript.sql -r 1 -U user -P password

次に、SSMS を SQLCMD モード Query -> CMDMODE に配置しましたが、それでもエラーは発生しませんでした。その後、数回再実行した後、両方でエラーが発生し始めました。

4

4 に答える 4

2

使いやすくエレガントな TRY-CATCH ブロックを使用してみてください。

1 = 0 の場合
BEGIN TRY
select * from mydatabase.dbo.mytable;
END TRY
BEGIN CATCH
-- エラー処理コード
SELECT ERROR_MESSAGE()
END CATCH

于 2009-11-02T15:37:18.473 に答える
1

ストアドプロシージャに組み込まれているexecute_sqlでこれを回避できると思います。

于 2009-10-16T17:34:11.287 に答える
0

開発環境で次のコードを実行します

DROP Procedure dbo.#TestProc
GO
CREATE Procedure dbo.#TestProc
AS

IF 1=0
BEGIN
 SELECT 1 FROM XXXXX
END
ELSE
BEGIN
 SELECT * 
 FROM Information_Schema.Tables 
 WHERE Table_Name = 'XXXXX'
END

GO
EXEC #TestProc

コンパイルします。実行します。コンパイルまたは実行中にエラーが発生することはありません。

SQL 2005 を使用しています。

結果からわかるように、 というテーブルはありませんXXXXX

あなたの条件が実際に満たされ、コードが実行されていると思います。


EDT

私が入力したものよりもさらに進んだ:

ストアド プロシージャが作成され、次のそれぞれに対して実行されます。

SELECT * FROM XXXXX.XXXXX /* owner XXXXX */
SELECT * FROM XXXXX.XXXXX.XXXXX /* database XXXXX */

名前を完全に修飾すると、コードが爆発します

SELECT * FROM XXXXX.XXXXX.XXXXX.XXXXX /* linked server XXXXX */ 

リンクサーバーを探しますが、見つからず、エラーがスローされます。

Msg 7202, Level 11, State 2, Procedure #TestProc, Line 6
Could not find server 'XXXXX' in sys.servers. 
Verify that the correct server name was specified. 
If necessary, execute the stored procedure sp_addlinkedserver 
to add the server to sys.servers.
Msg 2812, Level 16, State 62, Line 1
Could not find stored procedure '#TestProc'.
于 2009-10-16T17:48:48.083 に答える
0

鈍器ですが、エラーは無視できます。

:On Error ignoreスクリプトで?

-b および -V は、「重大度 < V」を無視します (試していません)。「オブジェクトなし」エラーを検出するのに役立つ可能性がありますが、実際にエラーがある場合は、重大度が V を超える独自のエラーをスローします。

MSDN の SQLCMD を参照してください

于 2009-10-20T19:46:46.187 に答える