SQLSERVER高手相助,绝对有搞头!(100分)

  • 主题发起人 主题发起人 无忧鱼
  • 开始时间 开始时间

无忧鱼

Unregistered / Unconfirmed
GUEST, unregistred user!
问题:如何用DELPHI获得SQLSERVER中某个表的主键字段列表、非空字段列表、各字段默认值等信息。我知道这些信息是存在系统表中的,但是该如何获取呢,请告知我详细方法。最好有例子。我看了这些系统表,但都是些ID,看来要深知SQLSERVER的高手才明白。
思路:我是想将这些表信息加入到TDATASET的控件中,这样我们的一些主键检查、非空字段检查、字段默认值等都可以在控件中统一实现。(我现在的方法是手工设置的)
 
蛤蟆:用数据字典呀
这样更通用呀
 
可数据字典要手工设置啊。
 
如果是ADO的话,可以用这个方法获得:
ADOConnect.OpenSchema(siPrimaryKeys,EmptyParam,EmptyParam,ADODataSet);
看一下OpenSchema的帮助,siPrimaryKeys可获得所有表的主键,换成其他的比如siColumns什么的可以得到你要的信息。
 
sp_help 看看
 
这是曾经写的一个例子,你看看,修改以下,应该可以得到你所要的
创建存储过程,显示对象的结构
create proc show
@objname nvarchar(776) = NULL -- object name we're after
as
declare @objid int
declare @no varchar(35), @yes varchar(35), @none varchar(35)
select @no = name from master.dbo.spt_values where type = 'B' and number = 0
declare @sysobj_type char(2)
select @objid = id, @sysobj_type = xtype from sysobjects where id = object_id(@objname)
if @sysobj_type in ('S ','U ','V ','TF','IF')
begin

-- SET UP NUMERIC TYPES: THESE WILL HAVE NON-BLANK PREC/SCALE
declare @numtypes nvarchar(80)
select @numtypes = N'tinyint,smallint,decimal,int,real,money,float,numeric,smallmoney'
-- INFO FOR EACH COLUMN
print ' '
select
'Column_name' = name,
'Type' = type_name(xusertype),
'Computed' = case when iscomputed = 0 then
@no else
@yes end,
'Length' = convert(int, length),
'Prec' = case when charindex(type_name(xtype), @numtypes) > 0
then
convert(char(5),ColumnProperty(id, name, 'precision'))
else
' ' end,
'Scale' = case when charindex(type_name(xtype), @numtypes) > 0
then
convert(char(5),OdbcScale(xtype,xscale))
else
' ' end,
'Nullable' = case when isnullable = 0 then
@no else
@yes end,
'TrimTrailingBlanks' = case ColumnProperty(@objid, name, 'UsesAnsiTrim')
when 1 then
@no
when 0 then
@yes
else
'(n/a)' end,
'FixedLenNullInSource' = case
when type_name(xtype) not in ('varbinary','varchar','binary','char')
then
'(n/a)'
When status &
0x20 = 0 then
@no
else
@yes END,
'Collation' = collation
from syscolumns where id = @objid and number = 0 order by colid
end
 
我觉得不防用ADO,通用些,支持ADO的其他数据库系统都适用。
 
我建过一个视图,可以完全满足你的要求:
CREATE view FieldCOLUMNS
as
SELECT
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
IS_NULLABLE = convert(varchar(3), CASE WHEN c.isnullable=1
then
'YES' else
'NO' END),
DATA_TYPE = spt_dtp.LOCAL_TYPE_NAME
FROM
sysobjects o,
syscolumns c JOIN spt_datatype_info spt_dtp
ON c.xtype = spt_dtp.ss_dtype
AND (spt_dtp.ODBCVer is null or spt_dtp.ODBCVer = 2)
AND (spt_dtp.AUTO_INCREMENT is null or spt_dtp.AUTO_INCREMENT = 0)
where
o.xtype IN ('U')
AND o.id = c.id AND c.number = 0
AND permissions(o.id) != 0
 
接受答案了.
 

Similar threads

回复
0
查看
848
不得闲
回复
0
查看
1K
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部