2013-05-08 133 views
0

我想寫一個SQL查詢將輸出表和視圖中的所有列。如何獲得包括視圖列的MS SQL的所有列

低於收益只是表列的查詢,但不包括視圖列

SELECT t.name AS table_name, SCHEMA_NAME(schema_id) AS schema_name, c.name AS column_name 
FROM sys.tables AS t 
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID 
ORDER BY schema_name, table_name; 

回答

5

試試這個(快速) -

SELECT 
     [object_name] = s.name + '.' + o.name 
    , column_name = c.name 
    , o.type_desc 
FROM sys.objects o 
JOIN sys.schemas s ON o.[schema_id] = s.[schema_id] 
JOIN sys.columns c ON o.[object_id] = c.[object_id] 
WHERE o.[type] IN ('U', 'V') 
ORDER BY [object_name] 

或者試試這個() -

SELECT 
     [object_name] = s.name + '.' + o.name 
    , column_name = c.name 
FROM (
    SELECT v.name, v.[object_id], v.[schema_id] 
    FROM sys.views v 

    UNION ALL 

    SELECT t.name, t.[object_id], t.[schema_id] 
    FROM sys.tables t 
) o 
JOIN sys.schemas s ON o.[schema_id] = s.[schema_id] 
JOIN sys.columns c ON o.[object_id] = c.[object_id] 
ORDER BY [object_name] 

裏面SYS.TABLES & sys.views:

ALTER VIEW sys.views AS 
    SELECT * 
    FROM sys.objects$ 
    WHERE type = 'V' 

ALTER VIEW sys.tables AS 
    SELECT * 
    FROM sys.objects$ o 
    LEFT JOIN sys.sysidxstats lob ON lob.id = o.object_id AND lob.indid <= 1 
    LEFT JOIN sys.syssingleobjrefs ds ON ds.depid = o.object_id AND ds.class = 8 AND ds.depsubid <= 1 -- SRC_INDEXTOLOBDS 
    LEFT JOIN sys.syssingleobjrefs rfs ON rfs.depid = o.object_id AND rfs.class = 42 AND rfs.depsubid = 0 -- SRC_OBJTOFSDS 
    LEFT JOIN sys.syspalvalues ts ON ts.class = 'LEOP' AND ts.value = o.lock_escalation_option 
    WHERE o.type = 'U' 
+0

這是美麗的,謝謝你。 – Mindaugas 2013-05-08 07:10:02

+0

不客氣@Mindaugas。 – Devart 2013-05-08 07:13:53

0

這將解決您的問題

SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS 

您可以訪問所有表和視圖信息

+0

@Devart從來沒有聽說過它,請查看官方文檔:http://msdn.microsoft.com/en-us/library/ms186778.aspx – 2013-05-08 06:42:39

+0

對不起,有點小錯誤:http://msdn.microsoft.com/zh-cn/ -us /庫/ ms187376.aspx – Devart 2013-05-08 06:45:58

相關問題