0

したがって、SQL スクリプトを実行する .bat ファイルがあります。

@ECHO --- 03_Case6395_Publication.sql ---  >> dbupt.log
sqlcmd -U %1 -P %2 -S %3 -d %4 -i 03_Case6395_Publication.sql -k -b >> dbupt.log
IF ERRORLEVEL 1 GOTO ErrorTag

スクリプトは実行され、エラーは発生しませんが、スクリプトは実際にはデータベースに影響を与えません。上記の例では、実行されているものは次のとおりです。

IF NOT EXISTS (SELECT 1 FROM [dbo].[syscolumns] WHERE [NAME] = N'MandatoryInList' AND [ID] = object_id(N'Pub_Type'))
BEGIN
    ALTER TABLE [dbo].[Pub_Type] ADD [MandatoryInList] bit NULL CONSTRAINT [DF_PubType_MandatoryInList] DEFAULT (0)
END
ELSE
BEGIN
    ALTER TABLE [dbo].[Pub_Type] ALTER COLUMN [MandatoryInList] bit NULL 
END
GO

スクリプトは非常に単純で、MandatoryInList という列が追加されると思われますが、そうではありません。奇妙なことに、スクリプトに構文エラーはなく、SQL Server Management Studio から実行すると正常に動作します。バッチ ファイルには正常に実行される他のスクリプトがあるため、アクセス許可やスクリプトを実行しているユーザーに問題はありません。

また、これは新しいプロセスを作成して実行することで GUI から実行されますが、コマンド ウィンドウは表示されません。しかし、とにかく、このようなツールを何ヶ月も問題なく実行してきました.

何か案は?

4

1 に答える 1

0

そのため、Management Studio からは機能しますが、sqlcmd を呼び出すバッチ ファイルからは機能しません。変...

何が原因なのかはわかりませんが、いくつかのアイデアを次に示します。

  • バッチ ファイルからではなく、コマンド プロンプトから同じ "sqlcmd" コマンドを手動で実行した場合、機能しますか?

  • GUI アプリからではなく、コマンド プロンプトからバッチ ファイルを実行すると、機能しますか?

  • dbupt.log ファイルに何が書き込まれていますか? 「--- 03_Case6395_Publication.sql ---」というヘッダーがあり、その後は空ですか?

  • スクリプトに PRINT ステートメントを追加して、IF 部分と ELSE 部分のどちらを実行しているかを確認できますか?

  • 「2>&1」演算子を使用して、エラー ストリームをログ ファイルにリダイレクトすることもできますか? 例えば:

    sqlcmd -U %1 -P %2 -S %3 -d %4 -i 03_Case6395_Publication.sql -k -b >> dbupt.log 2>&1

  • 「IF ERRORLEVEL 1」を「IF NOT ERRORLEVEL 0」に変更してみてはいかがでしょうか。

  • 実際に実行されている SQL を確認するために、SQL プロファイラーを使用してみましたか? 何か映りますか?

于 2009-12-12T06:21:23.377 に答える