這個需求是今天看到一網友在論壇提出的問題,這裡的紀錄為NULL,是指的紀錄為"NULL"值,而並不是表的紀錄數為0,所以我們可以通過CHECKSUM函數來實現這個需求,下面是實現的DEMO:
--運行環境:SQL Server 2005
USE tempdb
GO
SET NOCOUNT ON
IF OBJECT_ID('T1') IS NOT NULL
DROP TABLE T1
IF OBJECT_ID('T2') IS NOT NULL
DROP TABLE T2
IF OBJECT_ID('T3') IS NOT NULL
DROP TABLE T3
--建立測試環境
CREATE TABLE T1
(
col1 INT,
col2 INT,
col3 datetime
)
CREATE TABLE T2
(
col1 INT,
col2 VARCHAR(10),
col3 float
)
CREATE TABLE T3
(
col1 decimal(10,2),
col2 NCHAR(10)
)
GO
--插入測試數據
INSERT T1 SELECT NULL,NULL,NULL
UNION ALL SELECT NULL,NULL,NULL
INSERT T2 SELECT NULL,NULL,NULL
INSERT T3 SELECT NULL,NULL
UNION ALL SELECT NULL,N'Test'
GO
--刪除所有紀錄為NULL的表
DECLARE
@table_name sysname,
@sql NVARCHAR(1000)
DECLARE curTest CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR
SELECT name
FROM sys.tables
WHERE name NOT LIKE '#%'
AND name NOT IN('MSdistributor_Access')
OPEN curTest
FETCH NEXT FROM curTest INTO @table_name
WHILE @@FETCH_STATUS=0
BEGIN
SET @sql = N'
IF NOT EXISTS(
SELECT *
FROM ' + @table_name + N'
WHERE CHECKSUM(*) <> 2147483511
)
DROP TABLE ' + @table_name + N'
'
EXEC sp_EXECUTESQL @sql
FETCH NEXT FROM curTest INTO @table_name
END
CLOSE curTest
DEALLOCATE curTest
GO
SELECT * FROM T1 --拋出錯誤
SELECT * FROM T2 --拋出錯誤
SELECT * FROM T3
GO
--刪除測試環境
IF OBJECT_ID('T1') IS NOT NULL
DROP TABLE T1
IF OBJECT_ID('T2') IS NOT NULL
DROP TABLE T2
IF OBJECT_ID('T3') IS NOT NULL
DROP TABLE T3
從這個例子可以看到,T1,T2的表已經被刪除,因為它的所有紀錄都為NULL.
雖然它實現了這個需求,但可能存在以下隱患:
1:CHECKSUM()函數不能用於一些非可比數據類型:text、ntext、XML、image 和 cursor
2:如果表上存在一些外鍵約束,直接刪除,會拋出錯誤