我使用的第一个编程数据库是dBASE II。当时我最喜欢的命令是dispstru,它是显示结构的简写;它用一种方便实用的方式描述了表格的结构。
当我开始使用SQL服务器的时候,让我很心烦的是,我无法很容易地做到同样的事。尽管我可以使用内置的存储过程SP_HELP来描述一个表格,但是它的输出结果却无法很容易地用在别的地方。例如,SP_HELP会进行三次独立的SELECT,而且提供的信息要比我所希望的更多。所以我做了自己的工具,如下所示:
CREATE Procedure DispStru
(
@TableNamevarchar(50)
)
As
IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id = OBJECT_ID(N'[dbo].['+@tableName+']')
AND
OBJECTPROPERTY(id, N'IsUserTable') = 1)
SELECT
cols.name
as 'Name',
typs.name
as 'Type',
cols.Length,
cols.prec
as 'Precision',
cols.Scale,
Allownulls
as 'Allow Nulls'
FROM syscolumns cols
INNER
JOIN systypestyps ON cols.xusertype=typs.xusertype
WHERE id = OBJECT_ID(@tableName)
-- ORDER BY name
ELSE
PRINT 'No table named '+@tableName
+ ' in the ' + db_name() + '
Database'
RETURN
要注意函数OBJECT_ID()和OBJECTPROPERTY()的使用。后者要求其第一个参数是一个能够辨别关注对象的整数。这个值要使用OBJECT_ID()调用才能获得;然后,我们将它以及所关注的属性传递给OBJECTPROPERTY()。
ORDER BY这个述词(predicate)被注释了。我这样做是因为我正在模拟的dispstru命令没有将数据列按名字排序。如果我想要让数据列按字母顺序排列,我只用简单地取消对这一行的注释就行了。
注意:
取决于你想要对输出结果做什么,你可能重新编写这一个过程,将其作为一个用户定义的表格函数。例如这个选择可以让你将多个调用组合起来。
Arthur Fuller开发数据库应用程序已经有20年了。他的专业经验包括Access ADPs、微软SQL 2000、MySQL和.NET。