禁用SQLCMD语法检查

时间:2009-10-16 17:30:24

标签: sql sql-server tsql validation sqlcmd

我们有时会编写重命名表或列的数据端口脚本,并具有其他复杂的逻辑。我们在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模式查询 - > CMDMODE,它仍然没有给出错误。 然后在重新运行几次后,两者都开始出错。

4 个答案:

答案 0 :(得分:2)

尝试使用TRY-CATCH块,易于使用且优雅。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

脚本中的

:On Error ignore

-b和-V忽略“severity&lt; V”(未尝试过)。可能对检测“无对象”错误很有用,但在出现真正错误时将其自身置于V级以上。

See SQLCMD in MSDN