Ваш вопрос не проясняет, является ли XML всегда похожим на тот, который вы показываете (только один <fileLocation>
), или эта структура может содержать больше.
Если это только один может возникнуть вопрос: почему XML?
В любом случае: это сценарий макета для обоих случаев:
DECLARE @mockup TABLE(ID INT IDENTITY,TheXml XML);
INSERT INTO @mockup VALUES
('<objectMetaData>
<fileLocation fileName="CM63951.mxf06092018233409;21.png" />
</objectMetaData>')
,('<objectMetaData>
<fileLocation fileName="OneMore.png" />
</objectMetaData>')
,('<objectMetaData>
<fileLocation fileName="TheFirst.png" />
<fileLocation fileName="TheSecond.png" />
</objectMetaData>');
Вы можете выбрать первое напрямую.Не требуется производная таблица
--Returns the only (or the first) file name
SELECT m.ID
,TheXml.value('(/objectMetaData/fileLocation/@fileName)[1]','nvarchar(max)')
FROM @mockup m
- Если существует много узлов <fileLocation>
, нам нужна производная таблица через .nodes()
--Returns multiple filenames
SELECT m.ID
,fl.value('@fileName','nvarchar(max)')
FROM @mockup m
CROSS APPLY TheXml.nodes('/objectMetaData/fileLocation') A(fl);
Так что для вашего фактического запроса это должнобудь то
--for one filename per row
select XMLMetadata.value('(/objectMetaData/fileLocation/@fileName)[1]','nvarchar(max)')
from taObjectMetadata
where ObjectMetadataTypeId = 1
или
--for many filenames per row
select fl.value('@fileName','nvarchar(max)')
from taObjectMetadata
cross apply XMLMetadata.nodes('/objectMetaData/fileLocation') A(fl)
where ObjectMetadataTypeId = 1