ShowColumnUsage是一个能呈现table中constraints, indexes, foreign keys所有影响的列存储过程。
例如我们执行:
exec ShowColumnUsage 'BillOfMaterials'
那么将返回这些信息:
| Heading | ColumnName | Constraints | Indexes | ForeignKeys |
| BillOfMaterials | ||||
| BillOfMaterialsID | pk2 | |||
| ProductAssemblyID | udx1.1 | fk1 | ||
| ComponentID | udx1.2 | fk2 | ||
| StartDate | udx1.3 | |||
| EndDate | ||||
| UnitMeasureCode | idx3 | fk3 | ||
| BOMLevel | ||||
| PerAssemblyQty | ||||
| ModifiedDate |
你还可以使用 查询所有table:
exec ShowColumnUsage '%'
ShowColumnUsage 的 T-sql:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ShowColumnUsage]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[ShowColumnUsage]
gocreate procedure [dbo].[ShowColumnUsage]
@TableNameLike varchar(128) = null
as-- written by William Taladaif @TableNameLike is null
beginprint 'This stored procedure shows which columns of a table participate'
print 'in primary key constraints, unique constraints (alternate keys),'
print 'unique indexes, regular indexes, and foreign keys.'
print 'Any constraint or index numbered 1 is clustered.'
print ' exec ShowColumnUsage ''Ac%'''
return 0endset nocount on
-- List all tables and columns with their constraint columns pk, aks, fks, idxsdeclare @loop int,
@loopmax int-- get list of tablesdeclare@tables table (TableName varchar(100), TableId int)
insert into@tables
selectt.name,
t.object_id
fromsys.tables t
where t.name like @TableNameLike-- get list of colsdeclare@Cols table (TableId int, ColumnId int, ColumnName varchar(100), Constraints varchar(100), Indexes varchar(100), ForeignKeys varchar(100))
insert into@Cols
selectt.TableId,
c.column_id,
c.name,
'', '', ''from@tables t
join sys.columns c on t.Tableid=c.object_id-- get list of fk tablesdeclare @fks table (TableId int, FkId int, FkNbr int, FkColCnt int)
insert into@fks
selectparent_object_id,
object_id,
0,
(select max(constraint_column_id) from sys.foreign_key_columns fkc where fk.object_id=fkc.constraint_object_id)
fromsys.foreign_keys fk
join @tables c on fk.parent_object_id = c.TableId-- number the fksset @loop = 0while @@rowcount > 0
begin set @loop = @loop + 1 updatefks
set FkNbr=@loop
from@fks fks
wherefks.FkNbr=0
and fks.FkId in(
select min(FkId) from@fks
whereFkNbr=0
group by
TableId
)
end--select * from @fks
-- get pksdeclare @pks table (TableId int, PkId int, PkNbr int, PkColCnt int)
insert into@pks
selecti.object_id,
i.index_id,
i.index_id,
(select max(key_ordinal) from sys.index_columns ic
where i.object_id=ic.object_id and i.index_id=ic.index_id)
fromsys.indexes i
join @tables c on i.object_id=c.TableIdwherei.is_primary_key=1
--select * from @pks
-- get aksdeclare @aks table (TableId int, AkId int, AkNbr int, AkColCnt int)
insert into@aks
selecti.object_id,
i.index_id,
i.index_id,
(select max(key_ordinal) from sys.index_columns ic
where i.object_id=ic.object_id and i.index_id=ic.index_id)
fromsys.indexes i
join @tables c on i.object_id=c.TableIdwherei.is_unique_constraint=1
--select * from @aks
-- get udxsdeclare @udxs table (TableId int, UdxId int, UdxNbr int, UdxColCnt int)
insert into@udxs
selecti.object_id,
i.index_id,
i.index_id,
(select max(key_ordinal) from sys.index_columns ic
where i.object_id=ic.object_id and i.index_id=ic.index_id)
fromsys.indexes i
join @tables c on i.object_id=c.TableIdwherei.is_unique_constraint=0
and i.is_primary_key=0
andi.is_unique=1
--select * from @udxs
-- get idxsdeclare @idxs table (TableId int, IdxId int, IdxNbr int, IdxColCnt int)
insert into@idxs
selecti.object_id,
i.index_id,
i.index_id,
(select max(index_column_id) from sys.index_columns ic
where i.object_id=ic.object_id and i.index_id=ic.index_id)
fromsys.indexes i
join @tables c on i.object_id=c.TableIdwherei.is_unique_constraint=0
and i.is_primary_key=0
andi.is_unique=0
--select * from @idxs
------------------------------------------------------------------------------------ pk--declare @Cols table (TableId int, ColumnId int, ColumnName varchar(100), Constraints varchar(100), Indexes varchar(100), ForeignKeys varchar(100))
--declare @pks table (TableId int, PkId int, PkNbr int, PkColCnt int)
select @loopmax = max(PkNbr) from @pks
set @loop=0while @loop <= @loopmaxbegin updatec
setConstraints = Constraints
+ ' pk'+case p.PkColCnt
when 1 then cast(p.PkNbr as varchar(10))
else cast(p.PkNbr as varchar(10))+'.'+cast(ic.index_column_id as varchar(10))
end from@cols c
join @pks p on c.TableId=p.TableId joinsys.index_columns ic on p.TableId = ic.object_id and p.PkId = ic.index_id and c.ColumnId = ic.column_id
wherep.PkNbr = @loop
set @loop = @loop + 1end------------------- ak--declare @Cols table (TableId int, ColumnId int, ColumnName varchar(100), Constraints varchar(100), Indexes varchar(100), ForeignKeys varchar(100))
--declare @aks table (TableId int, AkId int, AkNbr int, AkColCnt int)
select @loopmax = max(AkNbr) from @aks
set @loop=0while @loop <= @loopmaxbegin updatec
setConstraints = Constraints
+ ' ak'+case p.AkColCnt
when 1 then cast(p.AkNbr as varchar(10))
else cast(p.AkNbr as varchar(10))+'.'+cast(ic.index_column_id as varchar(10))
end from@cols c
join @aks p on c.TableId=p.TableId joinsys.index_columns ic on p.TableId = ic.object_id and p.AkId = ic.index_id and c.ColumnId = ic.column_id
wherep.AkNbr = @loop
set @loop = @loop + 1end------------------- get udxs--declare @Cols table (TableId int, ColumnId int, ColumnName varchar(100), Constraints varchar(100), Indexes varchar(100), ForeignKeys varchar(100))
--declare @udxs table (TableId int, UdxId int, UdxNbr int, UdxColCnt int)
select @loopmax = max(UdxNbr) from @udxs
set @loop=0while @loop <= @loopmaxbegin updatec
setIndexes = Indexes
+ ' udx'+case p.UdxColCnt
when 1 then cast(p.UdxNbr as varchar(10))
else cast(p.UdxNbr as varchar(10))+'.'+cast(ic.index_column_id as varchar(10))
end from@cols c
join @udxs p on c.TableId=p.TableId joinsys.index_columns ic on p.TableId = ic.object_id and p.UdxId = ic.index_id and c.ColumnId = ic.column_id
wherep.UdxNbr = @loop
set @loop = @loop + 1end------------------- get idxs--declare @Cols table (TableId int, ColumnId int, ColumnName varchar(100), Constraints varchar(100), Indexes varchar(100), ForeignKeys varchar(100))
--declare @idxs table (TableId int, IdxId int, IdxNbr int, IdxColCnt int)
select @loopmax = max(IdxNbr) from @idxs
set @loop=0while @loop <= @loopmaxbegin updatec
setIndexes = Indexes
+ ' idx'+case p.IdxColCnt
when 1 then cast(p.IdxNbr as varchar(10))
else cast(p.IdxNbr as varchar(10))+'.'+cast(ic.index_column_id as varchar(10))
end + case ic.is_included_columnwhen 1 then '+'
else ''
end from@cols c
join @idxs p on c.TableId=p.TableId joinsys.index_columns ic on p.TableId = ic.object_id and p.IdxId = ic.index_id and c.ColumnId = ic.column_id
wherep.IdxNbr = @loop
set @loop = @loop + 1end------------------- get fks--declare @Cols table (TableId int, ColumnId int, ColumnName varchar(100), Constraints varchar(100), Indexes varchar(100), ForeignKeys varchar(100))
--declare @fks table (TableId int, FkId int, FkNbr int, FkColCnt int)
select @loopmax = max(FkNbr) from @fks
set @loop=0while @loop <= @loopmaxbegin updatec
setForeignKeys = ForeignKeys
+ ' fk'+case p.FkColCnt
when 1 then cast(p.FkNbr as varchar(10))
else cast(p.FkNbr as varchar(10))+'.'+cast(ic.constraint_column_id as varchar(10))
end from@cols c
join @fks p on c.TableId=p.TableId join sys.foreign_key_columns ic on p.FkId = ic.constraint_object_id and p.TableId = c.TableId and c.ColumnId = ic.parent_column_id
wherep.FkNbr = @loop
set @loop = @loop + 1end--select * from sys.foreign_key_columns
--selectx.Heading,
x.ColumnName,
x.Constraints,x.Indexes,
x.ForeignKeys
from(
select'' as Heading,
t.TableName,
c.ColumnId,
c.ColumnName,
c.Constraints,c.Indexes,
c.ForeignKeys
from@Tables t
join @Cols c on t.TableId=c.TableId union selectt.tableName,
t.tableName,
0,
'', '', '', '' from@Tables t
join @Cols c on t.TableId=c.TableId ) as xorder by
x.TableName,
x.ColumnId
return 0go
好了现在 在你数据库中查找你没有见过的错误方便多了。希望这篇POST对你有帮助。
Author:Petter Liu http://wintersun.cnblogs.com
浙公网安备 33010602011771号