2012-03-09 63 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。