2013-08-20 4 views
1

У меня есть таблица, некоторые из ее столбцов имеют тип данных bit. Мне нужно выбрать только столбцы типа данных [BIT] и со значением [TRUE].SQL Server 2008 Выберите определенные столбцы с конкретными данными

У меня есть следующий код для выбора только столбцов [BIT] из данной таблицы.

SELECT 
    OBJECT_NAME(c.OBJECT_ID) TableName, c.name ColumnName 
FROM 
    sys.columns AS c 
JOIN 
    sys.types AS t ON c.user_type_id= t.user_type_id 
JOIN 
    sys.all_objects as o ON o.object_id = c.object_id 
WHERE 
    t.name = 'bit' 
    AND o.name = 'TABLENAME' --this is the table name 
ORDER BY 
    c.OBJECT_ID 
GO 

Скажите, пожалуйста, как выбрать только те со значением [TRUE]

благодаря

+0

Столбцы не имеют значений - записи делают. Это может помочь предоставить образцы данных и ожидаемый результат. –

+1

Таблицы в схеме 'sys' предоставляют метаданные для ваших таблиц, но не содержат данных строк для ваших таблиц. Если вы хотите запросить данные в своей таблице, вам нужно присоединиться к своей таблице. –

+0

да, я знаю, мне нужно знать, как это сделать. –

ответ

2

Вы можете использовать динамический sql и таблицу temp с вашим запросом, чтобы вернуть значения столбцов с типом бит в true или false. Надеюсь, что это поможет.

DECLARE @SQL nvarchar(max) 
SET @SQL='DECLARE @TempTable table (Value bit,Table_Column nvarchar(500))' 
SELECT @[email protected]+';INSERT @TempTable (Value,Table_Column) SELECT '+c.name + ','' '+c.name + ' - ' + o.name + 
    ''' FROM [' 
     +o.name + ']' 
     FROM sys.columns AS c 
JOIN sys.types AS t ON c.user_type_id=t.user_type_id 
join sys.all_objects as o on o.object_id = c.object_id 
WHERE t.name = 'bit' 
and o.name = 'TABLENAME' --this is the table name 
ORDER BY c.OBJECT_ID -- columns 

SET @[email protected]+';SELECT Table_Column,Value= CASE Value WHEN 0 THEN ''False'' When 1 THEN ''True'' end FROM @TempTable;' 
print @SQL 
EXEC (@SQL) 
+0

Я пытался решить ваше решение в крайнем случае, но вы были превосходны. Вы сделали это лучше, чем я ожидал. Теперь все, что мне нужно, это просто добавить некоторые предложения для вашего кода. Спасибо. –

+0

рад, что это сработало – SoftwareCarpenter

1

Это не может быть сделано. схема Sys содержит информацию об объектах в вашей базе данных, а не о записях в таблице.

Единственный способ сделать это - взять информацию, которую вы имеете, и пропустить каждое имя таблицы в вашей БД, открыв каждую таблицу, которую возвращает ваш вышеописанный вид, и используя «WHERE ColumnName <>« NULL » квалификатор в вашем петлевом представлении.

+0

Я представил только пример кода для справки, и я знаю, что схема sys содержит только информацию об объектах. Мне нужно знать, насколько это полезно. –

+0

Как я уже сказал, вы можете использовать имена таблиц, которые возвращаются, поэтому вы точно знаете, какие таблицы и столбцы нужно проверить. Но вам все равно придется прокручивать базу данных и запрашивать каждую таблицу, чтобы узнать, установлен ли столбец True или False. Это определенно правильная отправная точка. –

+0

Как сравнить имя объекта [имя системы] с значением varchar, возвращаемым запросом –

Смежные вопросы