禁用SQLCMD语法检查

问题描述:

我们有时会编写重命名表或列并具有其他复杂逻辑的数据端口脚本。我们还在引用这些旧列或表的IF语句中使用SQL。我们有一个使用IF语句的标准来使得我们的SQL脚本能够很好地运行。禁用SQLCMD语法检查

然而,即使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模式查询 - > CMDMODE,它仍然没有给出错误。 然后重新运行几次后,它开始出现错误。

+0

我不认为这是可以做到的,但我会看着你的答复。 – 2009-10-16 17:32:57

我认为在存储过程中构建的execute_sql可以解决这个问题。

+0

是的,动态代码会支持这个。 – 2009-10-16 18:26:09

在你的开发环境

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

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

:On Error ignore在脚本中?

-b和-V忽略“严重性< V”(未尝试过)。可能对检测“无对象”错误很有用,但当出现真正的错误时,将自己置于高于V的严重程度。

See SQLCMD in MSDN

尝试使用的try-catch块,易于使用和优雅。

如果1 = 0
BEGIN TRY
SELECT * FROM mydatabase.dbo.mytable;
END TRY
BEGIN CATCH
--error处理代码
SELECT ERROR_MESSAGE()
END CATCH