SQL Server преобразует NULL в пустую строку в select *

Мне нужно выполнить следующее:

 SELECT * FROM [MY_TVF](9186)
 FOR XML AUTO, ELEMENTS

И замените все значения NULL пустой строкой '', чтобы включить их в XML. Я знаю, что могу выплюнуть элементы с атрибутом xsi:nil="true", установив ELEMENTS XSINIL, но я этого не хочу.

Я нашел этот вопрос: Преобразовать NULL в пустую строку SQL Server, где в ответе говорится, что я могу использовать ISNULL() для своего запроса. Пробовал вот так:

ISNULL((SELECT * FROM [MY_TVF](9186)),'')
FOR XML AUTO,ELEMENTS

Но я не могу заставить его работать. Я получаю следующую ошибку:

Сообщение 102, уровень 15, состояние 1, строка 1 Неправильный синтаксис рядом с ','.

Что я могу сделать, чтобы просто заменить все значения NULL пустой строкой, чтобы они были включены в XML?

Редактировать

Невозможно заменить * именами столбцов. Есть причина, по которой мы используем TVF, здесь около 40 столбцов, и они могут со временем меняться. Мой запрос - просто выбрать все и вернуть его как XML.


person MarioDS    schedule 08.08.2014    source источник
comment
Вы можете использовать isnull() или coalesce(), если перечисляете столбцы по отдельности. Они не обрабатывают несколько столбцов одновременно.   -  person Gordon Linoff    schedule 08.08.2014
comment
@GordonLinoff Я знаю это, но там около 40 столбцов, и некоторые из них имеют довольно длинные имена. Что еще более важно, они могут изменяться, и поэтому они указаны как TVF. Мне это нужно *!   -  person MarioDS    schedule 08.08.2014
comment
Я бы сказал, что `xsi: nil = true - это путь в соответствии с этой темой: stackoverflow.com/questions/774192/ Или вы могли бы написать динамический SQL для получения имен столбцов?   -  person NickyvV    schedule 08.08.2014
comment
@MDeSchaepmeester. . . Затем вам нужно использовать динамический SQL, чтобы получить все имена столбцов.   -  person Gordon Linoff    schedule 08.08.2014
comment
Почему бы вам не изменить TVF (или сделать копию), который использует COALESCE или ISNULL против столбцов, вместо того, чтобы топать ногами?   -  person Aaron Bertrand    schedule 08.08.2014
comment
Невозможно заменить * именами столбцов. Есть причина, по которой мы используем TVF, здесь около 40 столбцов, и они могут меняться со временем. Если столбцы меняются, просто войдите и измените свой оператор SQL. Это довольно распространенная практика в мире разработки. Выполнение SELECT * - плохая идея по ряду причин, и сейчас вы столкнулись с одной из них.   -  person Dave.Gugg    schedule 08.08.2014


Ответы (2)


Я удалил свой предыдущий ответ, и вот последний:

Declare @ColName as Varchar(max)
SEt @ColName=''
SELECT  @ColName= COALESCE( @ColName + ' ISNULL(' +c.name + ','''') ','', '') +
c.name + ', ' 
FROM sysobjects o
JOIN syscolumns c ON o.id = c.id
WHERE o.xtype = 'U'
AND (o.name ='tbName')
SEt @ColName=  ( 'Select ' + SUBSTRING(@ColName,0,LEN(@ColName)-1) + ' FROM tbName')
print @colname
EXEC(@ColName)
person Dev    schedule 08.08.2014
comment
Это предпочтительный метод почти для всех SQL. OP, возможно, никогда не пришлось бы делать это для левых / правых / полных соединений, что является странным для 2014 года. ISNULL не является ни переносимым, ни расширяемым. - person mckenzm; 21.08.2017

Откажитесь от привычки SELECT *

Посмотрите, работает ли это.

SELECT Col1,Col2,Col3,Col4,Col5
FROM
(
SELECT 
ISNULL(Col1,'') Col1,
ISNULL(Col2,'') Col2,
ISNULL(Col3,'') Col3,
ISNULL(Col4,'') Col4,
ISNULL(Col5,'') Col5
FROM [MY_TVF](9186)
) T
FOR XML AUTO,ELEMENTS
person Nick.McDermaid    schedule 08.08.2014
comment
Извините, рассматривайте мой комментарий как отклик Гордону Линоффу. Мне нужен *. Есть более 40 столбцов, и мне действительно нужны все данные. Если это не подходящая ситуация для оправдания использования *, я не знаю, что это такое. - person MarioDS; 08.08.2014
comment
Понятно. Если у вас есть источник с изменяющимися именами столбцов, вы попали в плохое место. - person Nick.McDermaid; 08.08.2014
comment
Я не уверен, что вы имеете в виду - переименование столбцов? Нет ничего плохого в переименовании столбцов, просто если у вас есть источник данных, в котором вы не можете рассчитывать на конкретный столбец с тем же именем или типом данных, или с тем же количеством столбцов, это обычно вызывает проблемы. Но в вашем вопросе недостаточно информации, чтобы сделать какое-либо твердое заявление по этому поводу. В любом случае, извините, что я больше ничем не мог помочь. Если это TVF, разве вы не можете поместить туда логику ISNULL? - person Nick.McDermaid; 08.08.2014