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 Profiler 查看实际执行的 SQL?有什么出现吗?

于 2009-12-12T06:21:23.377 回答