问题贴:http://topic.youkuaiyun.com/u/20100422/17/af3b725c-d647-4d34-854b-4b6e8b056fae.html?15171
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)
--------------------------------------------------------------------------
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
*/