2014-10-07 3 views
6

Я хотел бы выполнить SELECT, где он выбирает значение столбца, только если этот столбец существует в таблице, иначе отобразите null.SQL Server Как выбрать столбец только в том случае, если он существует в таблице

Это то, что я сейчас делаю:

SELECT TOP 10 CASE WHEN EXISTS 
    (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA ='test' and TABLE_NAME='tableName' and COLUMN_NAME='columnName') 
THEN columnName ELSE NULL END AS columnName 

Я также попытался это:

SELECT TOP 10 CASE WHEN 
    (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA ='test' and TABLE_NAME='tableName' and COLUMN_NAME='columnName') >0 
THEN columnName ELSE NULL END AS columnName 

Оба они работают хорошо, если столбец присутствует в таблице. Но когда колонна нет, он дает мне ошибку:

Неверное имя столбца 'ColumnName'

+3

Вам понадобится динамический SQL. Для любого конкретного запроса таблицы и столбцы, к которым он будет обращаться, фиксируются, и запрос даже не начнет выполнять и извлекать данные (которые ему понадобятся при попытках), если он не может скомпилировать. –

ответ

5

Вы можете написать как:.

SELECT CASE WHEN EXISTS 
(
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA ='test' and TABLE_NAME='tableName' 
    and COLUMN_NAME='columnName' 
) 
THEN 
(
    SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA ='test' and TABLE_NAME='tableName' 
    and COLUMN_NAME='columnName' 
) 
ELSE 
NULL 
END 
AS columnName 

DEMO

Edit: Если вы хотите выберите верхние 10 значений из столбца таблицы, если этот столбец существует, тогда вам нужно написать динамический запрос как:

SELECT @columnVariable =  
CASE WHEN EXISTS 
(
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA ='test' and TABLE_NAME='tableName' 
    and COLUMN_NAME='columnName' 
) 
THEN 
(
    SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA ='test' and TABLE_NAME='tableName' 
    and COLUMN_NAME='columnName' 
) 
ELSE 
NULL 
END 


/* Build the SQL string one time.*/ 
SET @SQLString = 
    N'SELECT TOP 10 ' + @columnVariable+ ' 
     FROM test.tableName ';  


EXECUTE sp_executesql @SQLString 

DEMO2

+0

спасибо Deepkshikah – Ocelot

0

Попробуйте это:

SELECT 
    TOP 1 
     CASE 
      WHEN COLUMN_NAME='columnName' THEN 
       COLUMN_NAME 
      ELSE 
       NULL 
      END 
     AS COLUMN_NAME 
FROM   
    INFORMATION_SCHEMA.COLUMNS 
WHERE 
    TABLE_SCHEMA ='test' and TABLE_NAME='tableName' 
ORDER BY 
    COLUMN_NAME DESC 
0
SELECT * 
     FROM sys.columns 
     WHERE [name] = N'columnName' 
      AND [object_id] = OBJECT_ID(N'tableName') 

Добавьте это в вашем случае заявление. Обратите внимание, что этот код будет работать только для более высокой версии SQLServer [как SQLServer 2008]