2011-08-31 26 views
1

場景:超過100個字段的表(不是我在做...我繼承了這個) 只有50個這些字段需要在網站上顯示 他們要維護其他50個歷史用途的田地。 未來有時可能會需要某些不需要的字段。簡單的方法來確定表中的必填字段

問題:我正在尋找一種輕鬆識別50個必填字段的方法,以便我可以使用查詢來拉字段名稱。

Psuedo Query: Select FieldNames from TableName where Required = Yes 


Is there a setting I could change? 
What about using Extended Properties? 

在此先感謝您提供的任何方向。

回答

3

如何創建只有必填字段的視圖。

+0

我喜歡這個答案。沒有想過一個觀點。 –

0

沒有標記可以放在字段上以確定它是否相關 - 這就是SELECT列表的用途。一些想法...

1)將歷史數據拆分成單獨的表格,與源表格具有一對一的關係。

2)將表中的歷史字段重新命名爲「OBSOLETE_」+字段名。這至少會爲您在編寫SQL時提供快速的可視化參考。

3)創建一個視圖。這個問題的一大缺點是,只要您嘗試將視圖用作其他查詢中的表格,就可以採取一些大的性能匹配。但是,如果你只是直接脫掉它而不加入它,你應該沒問題。

+0

我曾考慮嘗試#2和#3已被推薦在其他幾個答案。謝謝 –

+0

是的 - 我並沒有試圖剝奪任何人的意見,因爲他們都沒有提到使用視圖的可能性,我只是想指出這一點。 – Chains

1

除非我錯過了您的問題的細微差別,否則使用COLUMNS的INFORMATION_SCHEMA表。該查詢標識了表dbo.dummy中所需的所有列。

SELECT 
    IC.COLUMN_NAME 
FROM 
    INFORMATION_SCHEMA.COLUMNS IC 
WHERE 
    IC.TABLE_SCHEMA = 'dbo' 
    AND IC.TABLE_NAME = 'dummy' 
    AND IC.IS_NULLABLE = 'NO' 

在做了更多的思考之後,也許你想要一個通用查詢來抓取所有需要的列,然後構建出選擇查詢。此查詢涵蓋了可能的請求

DECLARE 
    @hax varchar(max) 
, @schemaName sysname 
, @tableName sysname 

SELECT 
    @schemaName = 'dbo' 
, @tableName = 'dummy' 

; WITH A AS 
(
    -- this query identifies all the columns that are not nullable 
    SELECT 
     IC.TABLE_SCHEMA + '.' + IC.TABLE_NAME AS tname 
    , IC.COLUMN_NAME 
    FROM 
     INFORMATION_SCHEMA.COLUMNS IC 
    WHERE 
     IC.TABLE_SCHEMA = @schemaName 
     AND IC.TABLE_NAME = @tableName 
     AND IC.IS_NULLABLE = 'NO' 
) 
, COLUMN_SELECT (column_list) AS 
(
    -- this query concatenates all the column names 
    -- returned by the above 
    SELECT STUFF((SELECT '], [' + A.Column_Name 
    FROM A 
    FOR XML PATH('')),1, 2, '') 
) 
-- Use the above to build a query string 
SELECT DISTINCT 
    @hax = 'SELECT ' + CS.column_list + '] FROM ' + A.tname 
FROM 
    A 
    CROSS APPLY 
     COLUMN_SELECT CS 

-- invoke the query 
EXECUTE (@hax) 
0

我不確定是否正確理解問題。這是你想要的?代碼在MS SQL中。

select t.name as TABLE_NAME, c.name as COLUMN_NAME, c.is_nullable 
from sys.tables t 
    inner join sys.columns c on c.object_id = t.object_id 
WHERE t.name = '<TableName>' 
    and c.is_nullable = 0 
0

我們使用單獨的元數據來描述數據庫中的所有表和列。我們存儲諸如友好名稱之類的信息(例如,'用戶名'列應作爲'用戶名'顯示給用戶),格式化等。您可以使用此方法存儲有關所需列的信息。

我們已經嘗試過對象擴展屬性(sp_addextendedproperty等),但metatable(s)解決方案對我們來說更好。

+0

我也喜歡這個答案。謝謝 –

0

在TSQL中,這並不容易,因爲您不能在選擇行中動態構建列,也無法爲這些列別名。解析器和查詢優化器需要一些東西是靜態的。它是一個ASP.NET網站嗎?在您的開發環境(例如C#)中,您可以動態構建查詢。