场景:超过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?
提前感谢您提供的任何方向。
答案 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#)中,您可以动态构建查询。