5

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

4

4 回答 4

2

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

if 1 = 0
BEGIN TRY
select * from mydatabase.dbo.mytable;
END TRY
BEGIN CATCH
--错误处理代码
SELECT ERROR_MESSAGE()
END CATCH

于 2009-11-02T15:37:18.473 回答
1

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

于 2009-10-16T17:34:11.287 回答
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'.
于 2009-10-16T17:48:48.083 回答
0

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

:On Error ignore在脚本中?

-b 和 -V 忽略“严重性 < V”(未尝试过)。可能有助于检测“无对象”错误,但在确实存在错误时将您自己的严重性提高到 V 级以上。

请参阅 MSDN 中的 SQLCMD

于 2009-10-20T19:46:46.187 回答