2012-03-09 132 views
0

我想知道是否有人可以请我用一种方法检索表信息,包括表中存储的实际当前数据的信息......我正在使用SQL Server 2008 R2和下面是当前脚本我已经...SQL:获取表/数据信息

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 

这样做是它得到最长不宜LARGEST(整体和小数部分seperately)数字在指定的列值。然后它返回最长整数和十进制数的长度。

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

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

最后澄清我要做的是: 加入第2个脚本,其中第2个脚本将获得每个表/列的值第1个脚本返回...输出类似这个:

Schema/Ta ble /列/类型/最大长度/精​​度/比例/最长整数/最长十进制

预先感谢您提供的任何帮助!

+0

您可以使用[sp_executesql](http://msdn.microsoft.com/zh-cn/library/ms188001.aspx)从上面的查询构建和执行sql。 – 2012-03-09 15:10:00

+0

@NikolaMarkovinović我不完全确定你的意思是...如果我运行它就像那个ID仍然放在参数,而我作为一个SP执行它...我想它动态加载数据,而第一个脚本是正在执行...每行都是该脚本中的表的列,因此我希望第二个脚本可以加载该特定列的信息... – 2012-03-09 15:18:33

+0

您可以制作查询。为此,声明从模式定义查询中读取并在某个varchar变量中构建select的游标。完成后,调用sp_executesql为您提供结果。这很难,容易出错,但我想不出另一种方式。附:一定要检查页面底部的示例以查看命令是如何构建的。 – 2012-03-09 15:26:26

回答

0

这是一个工作。

创建临时表来保存你的结果和信息

与从插入查询您的架构数据填充成

然后使用游标和exec()

例如这个列出了当前数据库中的所有表以及它们中有多少条记录。

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 

提示,当您正在盘算的事情了与打印@QueryString替换Exec的(@QueryString),您可以与引号乱七八糟得到。

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