我想编写一个SQL IF语句来检查本地临时表是否存在,但是这些类没有记录在SQL Anywhere系统目录中。
答案 0 :(得分:5)
请注意,您可以在11.0.1及更高版本中执行此操作:
DROP TABLE IF EXISTS t;
答案 1 :(得分:3)
如果您问的问题是“如果不存在错误,如何删除本地临时表?”然后答案很简单:只需DROP它并忽略任何错误:
BEGIN
DROP TABLE t;
EXCEPTION WHEN OTHERS THEN
END;
如果你真的需要知道“表格是否存在?”这个问题的答案。您可以查询表并分析生成的SQLSTATE。以下功能使用了几个功能:
ON EXCEPTION RESUME忽略SELECT引发的任何异常并将控制传递给IF语句。
EXECUTE IMMEDIATE允许您编写一个表名在字符串变量中的查询。
TOP 1确保即使表中包含一百万行,也只选择了一行。
ORDER BY 1允许您满足TOP只能在订购结果集时使用的要求。
SELECT 1减轻了指定列名的负担。
INTO @dummy表示SELECT(因此EXECUTE IMMEDIATE)不返回结果集。
如果SELECT工作,它要么将SQLSTATE设置为'00000'表示成功,要么将'02000'设置为未找到行。任何其他SQLSTATE意味着表格存在严重问题......就像它不存在一样。
CREATE FUNCTION f_table_is_ok
( IN @table_name VARCHAR ( 128 ) )
RETURNS INTEGER
ON EXCEPTION RESUME
BEGIN
DECLARE @dummy INTEGER;
EXECUTE IMMEDIATE STRING (
'SELECT TOP 1 1 INTO @dummy FROM ',
@table_name,
' ORDER BY 1' );
IF SQLSTATE IN ( '00000', '02000' ) THEN
RETURN 1
ELSE
RETURN 0
END IF;
END;
这是一些测试代码:
BEGIN
DECLARE LOCAL TEMPORARY TABLE tt ( c INTEGER );
DECLARE LOCAL TEMPORARY TABLE "t t" ( c INTEGER );
SELECT f_table_is_ok ( 'asdf' );
SELECT f_table_is_ok ( 'tt' );
SELECT f_table_is_ok ( '"t t"' );
SELECT f_table_is_ok ( '"SYS"."SYSTABLE"' );
END;
答案 2 :(得分:1)
只是尝试放弃它并忽略错误......
BEGIN
DROP TABLE表;
除此之外的例外情况
END;