2014-07-18 30 views
0

我在每個列中都有7-20列的大量視圖。我需要做一個查詢,它將返回與每個視圖中每列相關的表和列的列表。我的觀點的如何使用關係列出視圖中的所有列 - SQL Server

例子:

CREATE VIEW example AS 
SELECT t.NAME, t.AGE, t.ADDRESS, p.MOBILE, p.LAPTOP ... 
FROM person t, device p 
WHERE ... 

查詢結果(需要):

TABLE  COLUMN 
person  NAME 
person  AGE 
person  ADDRESS 
device  MOBILE 
device  LAPTOP 

這是可能的,如何?它爲我節省了很多時間(所有視圖中有超過900列)。

感謝

+0

您可以擁有查看名稱及其列名稱,但我認爲SQL Server不存儲可通過列名查看錶名的任何數據,因爲在視圖中列名可能不同於它們在表,你想要查詢只獲取視圖名稱和它們各自的列名稱嗎? –

+0

@ M.Ali不,我需要查詢來告訴我,我的數據庫中的表和列與該視圖的每一列都有關。只是爲了列出這些關係(因爲我可以得到表,列名...爲​​主鍵,例如)。 – Aleksandar

+1

SQL Server爲視圖中的列名分配一個新的對象ID,這是特定於該視圖的,它與表的任何其他對象ID都沒有關係,這非常容易理解,因爲視圖中的列名可能相同或可能不相同作爲表格中的列名稱。 –

回答

0

然而,你可以有這個查詢拉所有在場的意見,你的數據庫一起出現在他們圖的列。

SELECT v.name AS View_Name 
     ,c.name AS Column_Name 
FROM sys.views v 
INNER JOIN sys.all_columns c ON v.object_id = c.object_id 
+0

我已經有了。但它不夠。 – Aleksandar

0

這裏是一個更詳盡的解決方案,這個想法是意見的臨時錶轉換沒有記錄(從...選擇頂0 *),併爲每個表檢索信息模式的列名:

 
---Create this table First 
CREATE TABLE dbo.Views_Columns(
id INT IDENTITY(1,1) PRIMARY KEY, 
ViewName varchar(100), 
ColumnName varchar(100) 
) 

--START 
DECLARE @CurrentView varchar(100) 
DECLARE @CurrentSchema varchar(50) 
--Temp table #AllViews stores all views names 
SELECT s.name as SchemaName, v.name as ViewName, 0 as Processed 
INTO #AllViews 
FROM sys.views v INNER JOIN SYS.schemas s ON v.schema_id = s.schema_id 

WHILE EXISTS (select * from #AllViews WHERE Processed = 0) 
BEGIN 

    --Clean up our temp table 
    IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'temp') 
    BEGIN 
     DROP TABLE dbo.temp 
    END 

    SELECT TOP 1 @CurrentView = ViewName, @CurrentSchema = SchemaName 
    FROM #AllViews WHERE Processed = 0 

    EXEC('SELECT TOP 0 * INTO dbo.temp FROM '[email protected]+'.'[email protected]) 

    INSERT INTO Views_Columns 
    SELECT @CurrentSchema+'.'[email protected], Column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'temp' 

    UPDATE #AllViews SET Processed = 1 where ViewName = @CurrentView 
END 

SELECT * FROM Views_Columns 
--END 
相關問題