2016-05-12 33 views
4

我寫了下面的腳本來獲得指定表的列的一些數據:替代sys.columns.max_length

DECLARE @QueryTable varchar(35); 
SET @QueryTable = 'Test'; 

SELECT DISTINCT 
    sys.columns.name AS 'Column', 
    sys.types.name AS 'Data type', 
    CASE WHEN sys.types.name IN ('varchar', 'char') THEN CAST(sys.columns.max_length AS varchar(5)) 
    WHEN sys.types.name IN ('decimal', 'numeric') THEN CAST(CAST (sys.columns.precision AS nvarchar(10)) + ', ' + CAST(sys.columns.scale AS nvarchar(10)) AS nvarchar(10)) 
    WHEN sys.types.name IN ('nvarchar', 'nchar') THEN CAST(sys.columns.max_length/2 AS varchar(5)) 
    ELSE '-' END AS 'Max size', 
    CASE WHEN sys.columns.is_nullable = 1 THEN 'YES' 
    WHEN sys.columns.is_nullable = 0 THEN 'NO' END AS 'Allow nulls', 
    CASE WHEN sys.columns.name IN (SELECT Col.COLUMN_NAME from 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col 
WHERE 
    Col.Constraint_Name = Tab.CONSTRAINT_NAME 
    AND Col.Table_Name = Tab.TABLE_NAME 
    AND Constraint_Type = 'PRIMARY KEY' 
    AND Col.Table_Name = @QueryTable) THEN 'PK' 
    ELSE '' END AS 'Primary Key' 
FROM 
    sys.columns, sys.types, sys.tables 
WHERE 
    sys.tables.object_id = sys.columns.object_id AND 
    sys.types.system_type_id = sys.columns.system_type_id AND 
    sys.types.user_type_id = sys.columns.user_type_id AND 
    sys.tables.name = @QueryTable 
ORDER BY sys.columns.name 

當然,對於爲nvarchar的nchar類型我得到一個MAX_LENGTH這是該字段實際最大字符長度的兩倍。我的問題是,是否有任何地方可以直接獲得在創建列時定義的實際最大字符長度,而無需藉助此間接計算?

我用來輸出數字/小數類型數據的方法在我看來也是一團糟。

謝謝

回答

3

你試過:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
+0

好了,謝謝!現在看起來很明顯,但我從來沒有意識到表格包含我需要的確切長度。 – Renato

+1

注意:INFORMATION_SCHEMA.COLUMNS是一個系統視圖(不是表格)和msdn.microsoft.com/en-us/library/ms186778.aspx表示INFORMATION_SCHEMA是一個ISO標準,暗示了棄用的安全性,但是在https:///msdn.microsoft.com/en-us/library/ms186224.aspx我們看到:**重要**不要使用INFORMATION_SCHEMA視圖來確定對象的模式。查找對象模式的唯一可靠方法是查詢sys.objects目錄視圖。 INFORMATION_SCHEMA視圖可能不完整,因爲它們未針對所有新功能進行更新。 –