通过游标遍历数据库中的用户表,找出所有含有NULL值字段的表名和字段名

问题贴:http://topic.csdn.net/u/20100422/17/af3b725c-d647-4d34-854b-4b6e8b056fae.html?15171

 

编写SQL脚本,可以遍历Test数据库的所有数据表,针对各表的所有数据记录,分析出内容为NULL的字段
--创建测试数据
use test
go
if object_id ( ' test.dbo.tb1 ' ) is not null drop table tb1
-- 创建数据表
create table tb1
(
a1
char ( 2 ),
b1
char ( 2 ),
c1
int
)
go
-- 插入测试数据
insert into tb1 select ' A ' , ' B ' , 2
union all select ' A ' , ' C ' , 3
union all select ' A ' , ' D ' , null
union all select ' B ' , null , 3
union all select ' B ' , ' E ' , 8
union all select ' E ' , ' F ' , null
union all select ' E ' , ' G ' , 3
go
if object_id ( ' test.dbo.tb2 ' ) is not null drop table tb2
-- 创建数据表
create table tb2
(
a2
char ( 2 ),
b2
char ( 2 ),
c2
int
)
go
-- 插入测试数据
insert into tb2 select ' A ' , ' B ' , 2
union all select ' A ' , ' C ' , null
union all select ' A ' , ' D ' , 5
union all select ' B ' , ' C ' , 3
union all select null , ' E ' , null
union all select ' E ' , ' F ' , 2
union all select ' E ' , ' G ' , 3
go
if object_id ( ' test.dbo.tb3 ' ) is not null drop table tb3
-- 创建数据表
create table tb3
(
a3
char ( 2 ),
b3
char ( 2 ),
c3
int
)
go
-- 插入测试数据
insert into tb3 select ' A ' , ' B ' , 2
union all select ' A ' , ' C ' , 3
union all select ' A ' , ' D ' , 5
union all select ' B ' , ' C ' , 3
union all select ' B ' , ' E ' , 8
union all select ' E ' , ' F ' , 2
union all select ' E ' , ' G ' , 3
go
--查询
--------------------------------------------------------------------------
--  Author : htl258(Tony)
--  Date   : 2010-04-22 20:28:29
--  Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
--          Jul  9 2008 14:43:34
--          Copyright (c) 1988-2008 Microsoft Corporation
--          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
--------------------------------------------------------------------------
IF OBJECT_ID('TEMPDB..#T') IS NOT NULL
   
DROP TABLE #T
GO
CREATE TABLE #T(TBNAME NVARCHAR(120),COLNAME NVARCHAR(120))
SET NOCOUNT ON
DECLARE @S NVARCHAR(4000)
DECLARE C CURSOR FOR
   
SELECT 'IF EXISTS(SELECT TOP 1 1 FROM ['+B.NAME+'] WHERE ['+A.NAME+'] IS NULL)
                INSERT #T SELECT
'''+B.NAME+''','''+A.NAME+''''
   
FROM SYSCOLUMNS A JOIN SYSOBJECTS B ON A.ID=B.ID AND B.TYPE='U'
OPEN C
FETCH C INTO @S
WHILE @@FETCH_STATUS=0
BEGIN
   
EXEC(@S)
   
FETCH C INTO @S
END
CLOSE C
DEALLOCATE C
SET NOCOUNT OFF
SELECT * FROM #T

 

/*
TBNAME               COLNAME
-------------------- --------------------
tb1                  b1
tb1                  c1
tb2                  a2
tb2                  c2

(4 行受影响)
*/


--另一种需求:找出整个字段都为NULL值的表名和列名。

use test

go

if object_id('test.dbo.tb1') is not null drop table tb1

-- 创建数据表

create table tb1

(

a1 char(2),

b1 char(2),

c1 int

)

go

--插入测试数据

insert into tb1 select 'A','B',2

union all select 'A','C',3

union all select 'A','D',null

union all select 'B',null,3

union all select 'B','E',8

union all select 'E','F',null

union all select 'E','G',3

go

if object_id('test.dbo.tb2') is not null drop table tb2

-- 创建数据表

create table tb2

(

a2 char(2),

b2 char(2),

c2 int

)

go

--插入测试数据

insert into tb2 select 'A','B',null

union all select 'A','C',null

union all select 'A','D',null

union all select 'B','C',null

union all select null,'E',null

union all select 'E','F',null

union all select 'E','G',null

go

if object_id('test.dbo.tb3') is not null drop table tb3

-- 创建数据表

create table tb3

(

a3 char(2),

b3 char(2),

c3 int

)

go

--插入测试数据

insert into tb3 select 'A','B',2

union all select 'A','C',3

union all select 'A','D',5

union all select 'B','C',3

union all select 'B','E',8

union all select 'E','F',2

union all select 'E','G',3

go

IF OBJECT_ID('TEMPDB..#T') IS NOT NULL

    DROP TABLE #T

GO

CREATE TABLE #T(TBNAME NVARCHAR(120),COLNAME NVARCHAR(120))

SET NOCOUNT ON

DECLARE @S NVARCHAR(4000)

DECLARE C CURSOR FOR

    SELECT 'IF NOT EXISTS(SELECT TOP 1 1 FROM ['+B.NAME+'] WHERE ['+A.NAME+'] IS NOT NULL)

                INSERT #T SELECT '''+B.NAME+''','''+A.NAME+''''

    FROM SYSCOLUMNS A JOIN SYSOBJECTS B ON A.ID=B.ID AND B.TYPE='U'

OPEN C

FETCH C INTO @S

WHILE @@FETCH_STATUS=0

BEGIN

    EXEC(@S)

    FETCH C INTO @S

END

CLOSE C

DEALLOCATE C

SET NOCOUNT OFF

SELECT * FROM #T

 

/*

TBNAME COLNAME

tb2     c2

*/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值