Относительно динамического строительства sql - PullRequest
0 голосов
/ 08 июня 2011

когда мы загружаем xml в курсор, мы указываем имя столбца, его тип данных и размер. вместо указания вручную, как я могу сделать эту область динамической. предположим, что мой tsql выглядит следующим образом

Exec sp_xml_preparedocument @XMLFormat OUTPUT, @DetailXml

-- Create Cursor from XML Table

Declare CurDetailRecord
Cursor For
Select productid,unit,rate,qty,amount
From Openxml (@XMLFormat, '/NewDataSet/PurchaseOrderDetail', 2)
With
(
productid Varchar(10),
unit Varchar(50),
rate decimal(18,2),
qty decimal(18,3),
amount decimal(18,2)
)

здесь в качестве примера

productid Varchar(10),
unit Varchar(50) 

и т. Д. Я указываю, а также указываю их данные и размер.

так, как я могу построить эту область динамически и динамически получить имя столбца, тип и размер данных.

Пожалуйста, направляй меня, спасибо.

Ответы [ 2 ]

1 голос
/ 09 июня 2011

Вы можете получить имена столбцов (которые являются узлами внутри узла 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. Тогда вы можете построить динамическое утверждение, что вам нужно.

0 голосов
/ 08 июня 2011

Обычно информация о типах данных и именах полей описывается в XSD файле (определение схемы XML) .

Таким образом, вам необходим действительный XSD-файл для каждого вашего XML-файла, затем вы можете получить имя поля и тип данных.

Здесь приведена ссылка для лучшего понимания XSD

Издесь, как разобраться с XSD и XML, шаг за шагом

Надеюсь, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...