Я внес много изменений в вашу реализацию.
(1) Переменные таблицы вместо реальных таблиц (2) нет курсора на l oop через таблицу DB (3) Упрощенная проверка XSD (4) Получение сообщения об ошибке проверки реального XSD. Это позволяет понять, что происходит.
Проверка XSD завершается неудачно при самой первой ошибке и прекращается после этого. Вот почему, если у вас есть несколько ошибок, вам нужно будет повторно запустить SQL несколько раз.
Фактическая ошибка очень проста - вам нужно использовать type="xs:string"
вместо type="xs:unsignedShort"
для почти все атрибуты. Я уже исправил атрибуты Имя и Фамилия .
SQL
USE tempdb;
GO
-- DDL and sample data population, start
IF EXISTS (SELECT * FROM sys.xml_schema_collections
WHERE name = N'StudentSchema'
AND schema_id = SCHEMA_ID(N'dbo'))
DROP XML SCHEMA COLLECTION dbo.StudentSchema;
CREATE XML SCHEMA COLLECTION dbo.StudentSchema
AS N'<?xml version="1.0" encoding="utf-16"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Student">
<xs:complexType>
<xs:sequence>
<xs:element name="Anagrafica" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:attribute name="Name" type="xs:string" use="required" />
<xs:attribute name="Surname" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="Inidirzzo" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:attribute name="Via" type="xs:unsignedShort" use="required" />
<xs:attribute name="NCivico" type="xs:unsignedShort" use="required" />
<xs:attribute name="Comune" type="xs:unsignedShort" use="required" />
<xs:attribute name="Provincia" type="xs:unsignedShort" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="Scuola" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:attribute name="Name" type="xs:unsignedShort" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>';
GO
DECLARE @UvetTns_ISOS_XSDPNRList TABLE (ID INT IDENTITY PRIMARY KEY, XMLData XML NULL, LoadedDateTime DATETIME NULL);
DECLARE @UvetTns_ISOS_XMLTranformFailedEntry TABLE (ID INT NOT NULL, Reason NVARCHAR(1024) NULL);
INSERT INTO @UvetTns_ISOS_XSDPNRList (XMLData, LoadedDateTime) VALUES
(N'<?xml version="1.0" encoding="utf-16"?>
<Student>
<Anagrafica Name="Jona" Surname="Wild"/>
<Inidirzzo Via="Via Lacco" NCivico="10" Comune="Cincinella" Provincia="Milano"/>
<Scuola Name="Vesuvio di Milano"/>go
</Student>', GETDATE()),
(N'<?xml version="1.0" encoding="utf-16"?>
<Student>
<Anagrafica Name="Jona" Surname="Wild"/>
<Inidirzzo Via="Via Lacco" NCivico="10" Comune="Cincinella" Provincia="Milano"/>
</Student>', GETDATE());
-- DDL and sample data population, end
DECLARE @ID INT, @XML AS XML(dbo.StudentSchema)
, @RowCount INT = (SELECT COUNT(*) FROM @UvetTns_ISOS_XSDPNRList);
WHILE @RowCount > 0
BEGIN
BEGIN TRY
SELECT @ID = ID, @XML = XMLData
FROM @UvetTns_ISOS_XSDPNRList
ORDER BY ID DESC
OFFSET @RowCount - 1 ROWS FETCH NEXT 1 ROWS ONLY;
--SELECT @ID AS ID, @XML AS [XML];
END TRY
BEGIN CATCH
INSERT INTO @UvetTns_ISOS_XMLTranformFailedEntry (ID, Reason)
VALUES (@ID, ERROR_MESSAGE());
END CATCH
SET @RowCount -= 1;
END;
-- test
SELECT * FROM @UvetTns_ISOS_XMLTranformFailedEntry;
Вывод
+----+-------------------------------------------------------------------------------------------------------+
| ID | Reason |
+----+-------------------------------------------------------------------------------------------------------+
| 1 | XML Validation: Invalid simple type value: 'Via Lacco'. Location: /*:Student[1]/*:Inidirzzo[1]/@*:Via |
| 2 | XML Validation: Invalid simple type value: 'Via Lacco'. Location: /*:Student[1]/*:Inidirzzo[1]/@*:Via |
+----+-------------------------------------------------------------------------------------------------------+