Вы можете получить имена столбцов (которые являются узлами внутри узла PurchasePrderDetail) следующим образом:
declare @xml xml='<NewDataSet><PurchaseOrderDetail>
<productid>19125</productid>
</PurchaseOrderDetail></NewDataSet>'
SELECT b.value('local-name(.)','nvarchar(128)')ColumnName,
LEN(b.value('.','nvarchar(128)'))MaxLength
FROM @xml.nodes('/NewDataSet/PurchaseOrderDetail/*') a(b)
Таким образом, вы можете сгенерировать динамический оператор SQL для создания курсора с соответствующими именами столбцов и длиной, например, varchar (MaxLength).
Но вы не можете получить типы данных из XML, не зная реальных имен столбцов, потому что данные в xml - это просто текст и т. Д. «5» может быть int
типа, а также просто текст.
EDIT
Если вы знаете имя таблицы, вы можете построить динамический оператор SQL, используя метаданные из этой таблицы, используя:
; With cols as(
SELECT COLUMN_NAME,
UPPER(DATA_type)
+
case when data_type like '%char' then
case when CHARACTER_MAXIMUM_LENGTH=-1 THEN ' (MAX)'
else ' ('+CAST(CHARACTER_MAXIMUM_LENGTH as nvarchar)+')'
END
ELSE ''
END ColConv
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='PurchaseOrderDetail'),
XMLS as(
SELECT b.value('local-name(.)','nvarchar(128)')ColumnName,
b.value('.','nvarchar(128)')Value
FROM @xml.nodes('/NewDataSet/PurchaseOrderDetail/*') a(b)
)
SELECT XMLS.ColumnName,'CAST ('''+XMLS.Value+''' AS '+ ColConv+''')' FROM XMLS
JOIN cols ON XMLS.ColumnName=cols.COLUMN_NAME
В качестве вывода у вас будет имя и значение столбца с соответствующим предложением CAST
. Тогда вы можете построить динамическое утверждение, что вам нужно.