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