SQL:获取表/数据信息

时间:2012-03-09 15:05:32

标签: sql sql-server-2008

我想知道是否有人可以通过检索表信息的方式来启发我,包括有关表存储的实际当前数据的信息...我正在使用 SQL Server 2008 R2 ,以下是我目前的剧本......

SELECT
Sch.name AS 'Schema',
Tb.Name AS 'Table',
C.Name AS 'Column',
Tp.Name AS 'Type',
C.max_length,
C.precision,
C.scale
FROM Sys.Tables Tb
JOIN Sys.Schemas Sch
ON Sch.Schema_Id = Tb.Schema_Id
JOIN Sys.Columns C
ON C.Object_Id = Tb.Object_Id
JOIN Sys.Types Tp
ON Tp.System_Type_Id = C.System_Type_Id
WHERE Tp.name = 'numeric'
AND C.scale > 4
ORDER BY Sch.name ASC, Tb.name ASC, C.name ASC

此脚本检索我在数据库中拥有的每个表所需的所有信息。然后我有另一个脚本,我手动输入我想要信息的表和列。

SELECT 'Numeric Count' AS CounterType
, MAX(LEN(CAST(FLOOR(beca_proy_precio) AS VARCHAR(38)))) AS '1'
, MAX(LEN(CAST(FLOOR(beca_proy_precio_dol) AS VARCHAR(38)))) AS '2'
, MAX(LEN(CAST(FLOOR(beca_proy_tc) AS VARCHAR(38)))) AS '3'
FROM Comercial.beca_proyectada

UNION ALL

SELECT 'Decimal Count' AS CounterType
, MAX(LEN(CAST(REVERSE(STUFF(CAST(beca_proy_precio % 1 AS VARCHAR(38)), 1, 2, '')) AS DECIMAL(38, 0)))) AS '1'
, MAX(LEN(CAST(REVERSE(STUFF(CAST(beca_proy_precio_dol % 1 AS VARCHAR(38)), 1, 2, '')) AS DECIMAL(38, 0)))) AS '2'
, MAX(LEN(CAST(REVERSE(STUFF(CAST(beca_proy_tc % 1 AS VARCHAR(38)), 1, 2, '')) AS DECIMAL(38, 0)))) AS '3'
FROM Comercial.beca_proyectada

这样做是指在指定的列中获得最长的NOT LARGEST(单独的全部和小数部分)数值。然后它返回最长整数和十进制数的长度。

例如: 第1行 - 940.34910 => 3整数,4位小数 第2行 - 1.1304902 => 1个整数,7位小数

因此,在这种情况下,它将返回3表示最长的整数,7表示最长的十进制数

最后澄清一下我要做的是: 加入2个脚本,第二个脚本将获取第一个脚本返回的每个表/列的值...输出如下内容:

架构/表格/列/类型/最大长度/精​​度/比例/最长整数/最长十进制

提前感谢您提供的任何帮助!!

1 个答案:

答案 0 :(得分:0)

这是一项工作。

创建一个临时表来保存结果和信息

使用插入

的查询填充您的架构数据

然后使用游标和exec()

e.g。这个列出了当前数据库中的所有表以及它们中的记录数。

Create #Results (TableName VarChar(255) not null, TableCount null)

insert into #Results(TableName) Select Name From Sys.Tables

Declare @TableName VarChar(255)
Declare @QueryString VarChar(255)
Declare TableNameCursor Cursor For Select TableName From #Results
Open TableNameCursor
Fetch Next From TableNameCursor Into @TableName
While @@Fetch_Status = 0
Begin
  Select @QueryString = 'Declare @rc int Select @rc = Count(*) From ' + @TableName + ' + Insert #Results Select ''' + @TableName + ''',@rc'
  Exec(@QueryString)
  Fetch Next From TableNameCursor Into @TableName 
End
Close TableNameCursor
DeAllocate TableNameCursor

Select * from #Results

提示,当你想要用Print @QueryString替换Exec(@QueryString)时,你可以搞清楚引号。

哦,你正在执行的查询有它自己的范围,它可以看到@rc,但不能看到@TableName。