2011-08-31 47 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#)中,您可以动态构建查询。