我想编写一个 SQL IF 语句来检查是否存在本地临时表,但这些类型的表没有记录在 SQL Anywhere 系统目录中。
问问题
4057 次
3 回答
5
请注意,您可以在 11.0.1 及更高版本中执行此操作:
DROP TABLE IF EXISTS t;
于 2009-05-06T15:01:00.327 回答
3
如果您问这个问题,“如果本地临时表不存在,我如何删除它而不引发错误?” 那么答案很简单:只需 DROP 并忽略任何错误:
BEGIN
DROP TABLE t;
EXCEPTION WHEN OTHERS THEN
END;
如果你真的需要知道“表 t 存在吗?”这个问题的答案。您可以查询该表并分析生成的 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;
于 2009-05-06T12:45:08.250 回答
1
无论如何都尝试删除它并忽略错误...
BEGIN
DROP TABLE 表;
其他情况除外
结尾;
于 2009-05-06T12:45:05.753 回答