sqlcmd运行脚本但脚本不影响数据库

时间:2009-12-11 16:44:59

标签: sql-server-2005 batch-file sqlcmd

因此我们有一个运行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运行的。但无论如何,我已经运行了这样的工具数月而没有任何问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

因此它可以从Management Studio运行,但不能从调用sqlcmd的批处理文件中运行。奇怪...

我不知道是什么原因造成的,但这里有一些想法:

  • 如果从命令提示符手动运行相同的“sqlcmd”命令,而不是从批处理文件运行,那么它是否有效?

  • 如果从命令提示符运行批处理文件,而不是从GUI应用程序调用它,它是否有效?

  • 你的dbupt.log文件是什么写的?它是否有标题“--- 03_Case6395_Publication.sql ---”,之后它是空的?

  • 您可以在脚本中添加一些PRINT语句,以便查看它是在执行IF还是ELSE部分?

  • 您是否可以尝试使用“2>& 1”运算符将错误流重定向到日志文件? E.g:

    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?有什么事情出现吗?