轻松识别表格中的必填字段

时间:2011-08-31 17:42:06

标签: tsql sql-server-2008

场景:超过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?

提前感谢您提供的任何方向。

6 个答案:

答案 0 :(得分:3)

如何创建仅包含必填字段的视图。

答案 1 :(得分:2)

除非我错过了您的问题的细微差别,否则请使用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'

在做了更多思考之后,也许你想要一个通用查询来获取所有必需的列,然后构建select查询。此查询涵盖了可能的请求

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)

答案 2 :(得分:0)

你可以在一个字段上放置一个标志来确定它是否相关 - 这就是SELECT列表的用途。一些想法...

1)将历史数据拆分为一个单独的表,与源表具有一对一的关系。

2)将表中的历史字段重命名为“OBSOLETE_”+ fieldname。这至少会为您提供一个快速的可视化参考,供您在编写SQL时使用。

3)创建一个视图。这个问题的一大缺点是,只要您尝试将视图用作其他查询中的表,就可以获得一些重要的性能命中。但如果你只是在没有加入它的情况下直接将它拉下来,你应该没问题。

答案 3 :(得分: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

答案 4 :(得分:0)

我们使用单独的元表来描述数据库中的所有表和列。我们存储友好名称等信息(例如'用户名'栏目应显示给用户作为'用户名'),格式化等。您可以使用此方法存储有关所需列的信息。

我们尝试过对象扩展属性(sp_addextendedproperty等),但metatable(s)解决方案对我们来说更好。

答案 5 :(得分:0)

在TSQL中,这并不容易,因为您无法动态构建选择行中的列,也无法为这些列创建别名。解析器和查询优化器需要一些静态的东西。它是一个ASP.NET网站吗?在您的开发环境(例如C#)中,您可以动态构建查询。