程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 如何刪除所有紀錄都為NULL的表

如何刪除所有紀錄都為NULL的表

編輯:關於SqlServer
這個需求是今天看到一網友在論壇提出的問題,這裡的紀錄為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:如果表上存在一些外鍵約束,直接刪除,會拋出錯誤

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved