Попробуйте, чтобы понять неявные значения по умолчанию:
SELECT CAST(NULL AS INT)
,CAST('' AS INT)
,CAST(' ' AS INT);
A NULL
остается неизменным, но пусто по умолчанию обнуляется.Это спроектированное поведение.
Теперь вернемся к вашей проблеме:
DECLARE @DietaryTypeXML XML='<dietTypes>
<dietType>
<dietaryID></dietaryID> <!-- This is empty -->
</dietType>
</dietTypes>';
- Движок получает пустое значение и по умолчанию обнуляет его.
- Если вы используетеvarchar
Вместо этого вы получите пробел, но вам придется иметь дело со строковыми числами.
SELECT DietTypes.Col.value('dietaryID[1]', 'INT') AS Empty_in_INT_is_implicitly_taken_as_zero
,DietTypes.Col.value('dietaryID[1]', 'VARCHAR(100)') AS Empty_in_VARCHAR_is_implicitly_taken_as_empty_string
FROM @DietaryTypeXML.nodes('//dietType') DietTypes(Col);
- Предлагаемое мной решение:
SELECT DietTypes.Col.value('dietaryID[1] cast as xs:int?', 'INT')
FROM @DietaryTypeXML.nodes('//dietType') DietTypes(Col);
ИспользованиеXQuery cast as xs:int?
сообщает движку, что данное значение имеет значение null.Теперь возвращаемое значение больше не пусто , но NULL .