Простой способ определить обязательные поля в таблице - PullRequest
1 голос
/ 31 августа 2011

Сценарий: таблица с более чем 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 ]

3 голосов
/ 31 августа 2011

Как насчет создания представления, которое имеет только обязательные поля.

2 голосов
/ 31 августа 2011

Если у меня нет нюанса в вашем вопросе, используйте таблицу INFORMATION_SCHEMA для COLUMNS.Этот запрос идентифицирует все необходимые столбцы в таблице 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)
0 голосов
/ 31 августа 2011

В TSQL это не легко, поскольку вы не можете динамически создавать столбцы в строке выбора или псевдоним для этих столбцов. Синтаксический анализатор и оптимизатор запросов должны быть статичными. Это веб-сайт ASP.NET? В вашей среде разработки (например, C #) вы можете динамически создавать запрос.

0 голосов
/ 31 августа 2011

Мы используем отдельные метатаблицы, описывающие все таблицы и столбцы в базе данных.Мы храним такую ​​информацию, как понятное имя (например, столбец «имя пользователя» должен отображаться пользователю как «Имя пользователя»), форматирование и т. Д. Вы можете использовать этот подход для хранения информации о необходимых столбцах.

Мы пыталисьрасширенные свойства объекта (sp_addextendedproperty и т. д.), но решение метатабельных (ых) решений подошло нам лучше.

0 голосов
/ 31 августа 2011

Я не уверен, правильно ли я понял вопрос. Это то, что вы ищите? Код в 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 голосов
/ 31 августа 2011

Нет флага, который вы можете поставить на поле, чтобы определить, является ли он релевантным или нет - для этого предназначен список SELECT.Пара идей ...

1) Разделить исторические данные в отдельную таблицу с отношением один к одному с исходной таблицей.

2) Переименоватьисторические поля в вашей таблице как "OBSOLETE_" + fieldname.Это по крайней мере даст вам быстрый визуальный справочник, когда вы пишете свой sql.

3) Создайте представление.Большим недостатком этого является то, что вы можете получить некоторые большие потери производительности, как только вы попытаетесь использовать представление в качестве таблицы в других запросах.Но если вы просто снимаете это напрямую, не присоединяясь, у вас все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...