【问题标题】:Disable SQLCMD Syntax Check禁用 SQLCMD 语法检查
【发布时间】:2009-10-16 17:30:23
【问题描述】:

我们有时会编写重命名表或列并具有其他复杂逻辑的数据端口脚本。我们在引用那些旧列或表的 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

另一个奇怪的事情是它并不总是一致的,有时它工作正常。

有谁知道我是否可以通过脚本禁用这些类型的检查。

谢谢

注意

我知道人们会说他们尝试了类似的情况并且没有错误。起初对我来说,它在 SSMS 中没有出错,但在 SQLCMD 中出错。

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

然后我将 SSMS 置于 SQLCMD 模式 Query -> CMDMODE ,它仍然没有给出错误。 然后重新运行几次后,两者都开始出错。

【问题讨论】:

  • 我不认为这可以做到,但我会看着你得到的答复。

标签: sql sql-server tsql validation sqlcmd


【解决方案1】:

尝试使用 TRY-CATCH 块,简单易用,优雅。

如果 1 = 0
开始尝试
从 mydatabase.dbo.mytable 中选择 *;
结束尝试
开始捕捉
--错误处理代码
选择 ERROR_MESSAGE()
结束捕获

【讨论】:

    【解决方案2】:

    我认为execute_sql内置存储过程可以解决这个问题。

    【讨论】:

      【解决方案3】:

      在您的开发环境中运行以下代码

      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 的表。

      我认为您的条件实际上已经得到满足并且代码正在执行。


      编辑

      我比我输入的更进一步:

      为以下各项创建并运行存储过程

      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'.
      

      【讨论】:

        【解决方案4】:

        钝器,但你可以忽略错误。

        :On Error ignore 在脚本中?

        -b 和 -V 忽略“严重性

        See SQLCMD in MSDN

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-11
          • 1970-01-01
          • 1970-01-01
          • 2012-10-04
          • 2021-05-16
          • 2014-08-10
          • 1970-01-01
          相关资源
          最近更新 更多