禁用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,它仍然没有给出错误。 然后重新运行几次后,它开始出现错误。
我认为在存储过程中构建的execute_sql可以解决这个问题。
是的,动态代码会支持这个。 – 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的严重程度。
尝试使用的try-catch块,易于使用和优雅。
如果1 = 0
BEGIN TRY
SELECT * FROM mydatabase.dbo.mytable;
END TRY
BEGIN CATCH
--error处理代码
SELECT ERROR_MESSAGE()
END CATCH
我不认为这是可以做到的,但我会看着你的答复。 – 2009-10-16 17:32:57