Выбор столбцов, которые не являются пустыми - PullRequest
0 голосов
/ 17 апреля 2019

Итак, у меня есть запрос, который выглядит так -

select 
case when @subType = 1 or @subType = 2 then id end as Id,
case when  @subType = 3 then name end as name
case when @subType = 3 or @subType = 2 then address end as address
from 
table

Итак, у меня проблема в том, что если @subType равен 3, тогда столбец с именем ID будет нулевым. Я тогда не хочу возвращать весь этот столбец. И наоборот, если @subType равен 2, тогда name будет иметь значение null, поэтому я не хочу весь этот столбец.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Единственный способ сделать это - использовать динамический SQL (как упоминает Гордон). Если это запрос, а не функция view, тогда вы можете сделать это:

DECLARE @subType tinyint = 3;

DECLARE @SQL nvarchar(MAX);

SET @SQL = N'SELECT ' +
           STUFF(CASE WHEN @subType IN (1,2) THEN N',' + NCHAR(13) + NCHAR(10) + N'       id' ELSE N'' END + 
                 CASE WHEN @subType = 3 THEN N',' + NCHAR(13) + NCHAR(10) + N'       [name]' ELSE N'' END + 
                 CASE WHEN @subType IN (3,2) THEN N',' + NCHAR(13) + NCHAR(10) + N'       [address]' ELSE N'' END, 1, 10,N'') + NCHAR(13) + NCHAR(10) +
           N'FROM YourTable;';

PRINT @SQL; --Your debugging best friend.
--EXEC sp_executesql @SQL; --Uncomment to run the statement

Но, если запрос поступает с уровня представления, то в действительности он должен обрабатывать отображаемые столбцы, а не SQL Server

Если вы также передаете параметры в WHERE вашего запроса, убедитесь, что вы параметризовали вызов sp_executesql; не вводить значения параметров в динамический оператор.

1 голос
/ 17 апреля 2019

Это слишком долго для комментария.

Запрос SQL возвращает фиксированный набор столбцов с именами и типами, определенными в SELECT. У него не может быть переменного числа столбцов.

Чтобы делать то, что вы хотите, вам нужно использовать динамический SQL. Я не уверен, что это работает в вашем контексте. Например, динамический SQL не поддерживается в пользовательских функциях SQL Server.

...