代码之家  ›  专栏  ›  技术社区  ›  Ryu

禁用SQLCMD语法检查

  •  5
  • Ryu  · 技术社区  · 16 年前

    我们有时会编写数据端口脚本,重命名表或列,并具有其他复杂的逻辑。我们还有SQL in IF语句引用这些旧列或表。我们有一个标准,可以使用IF语句使我们的SQL脚本多运行友好。

    然而,偶尔,即使if语句的计算结果为false,包裹在块中的代码也会出错,我猜是因为语法检查。

    if 1 = 0
    begin
    
       select * from mydatabase.dbo.mytable; -- doesn't execute, but still errors because doesn't exist
    
    end
    

    有人知道我是否可以逐个脚本禁用这些检查。

    谢谢

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

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

    然后,我将ExpressRoute置于SQLCMD模式查询->CMDMODE,它仍然没有给出错误。

    4 回复  |  直到 16 年前
        1
  •  2
  •   Dan S    16 年前

    如果1=0
    开始尝试
    从mydatabase.dbo.mytable中选择*;


    --错误处理代码
    选择错误消息()
    终点接球

        2
  •  1
  •   Ryu    16 年前

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

        3
  •  0
  •   Raj More    16 年前

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

    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
    

    它编译。它执行。它在编译或执行过程中都不会出错。

    从结果中可以看出,没有名为的表 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'.
    
        4
  •  0
  •   gbn    16 年前

    :On Error ignore 在剧本中?

    -b和-V忽略“严重性<V”(未尝试)。可能有助于检测“无对象”错误,但当确实存在错误时,会抛出严重性高于V的错误。

    See SQLCMD in MSDN