Сегодня у меня есть новая ситуация, в которой из клиента спрашивает следующее:SSIS 2012 - Загрузка XML-файлы из папки в таблицу SQL Server COLUMN, используя Execute SQL Task и цикл просмотра контейнера
У нас есть файлы XML в папка. Нам нужно загрузить эти файлы в столбец таблицы SQL Server (который имеет тип данных XML); мы НЕ загружаем выходы XML в различные таблицы SQL Server, вместо этого мы загружаем сам XML-файл в столбец с типом данных XML в базе данных SQL Server.
Это должно быть сделано только в SSIS, согласно требованиям клиента. Таким образом, я использую Execute SQL Task таким образом. (Помимо XML-файла, нам нужны ImportDate
,и т. Д.)
Тип подключения - OLE DB; SQL Statement I have выглядит следующим образом:
INSERT INTO dbo.tablename (IncomingXMLfile, ImportDate)
-- I am using just 2 columns as an example for this table--
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE()
FROM OPENROWSET(BULK 'C:\Mic\...........\API_Schemas\ABC.xml', SINGLE_BLOB) AS x;
Это прекрасно работает, когда я жестко задаю только один файл. Теперь, в папке C:\Mic\...\API_Schemas
, есть много файлов XML, мне нужно загрузить каждый из них, и кроме этого получить их ImportDate
(GETDATE()
) и имя самого файла (я не упомянул этот столбец для теперь в заявлении INSERT). Я должен использовать контейнер ForEachLoop и помещать задачу Execute SQL в этот контейнер.
Следовательно, есть 2 аспекта этой проблемы:
Параметрирование имя файла внутри Execute SQL Task.
Использование контейнера ForEachLoop (и размещение этой задачи выполнения SQL внутри) для запуска каждого XML-файла в папке.
Я использую пользовательскую переменную с именем Filename
(строка тип данных), который имеет значение ABC.xml
(первый файл в серии файлов XML в папке); Я параметризовать выше запрос TSQL такого способа (см ниже):
INSERT INTO dbo.tablename (IncomingXMLfile, ImportDate)
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE()
FROM OPENROWSET(BULK 'C:\Mic\...........\API_Schemas\?', SINGLE_BLOB) AS x;
я отображающий этот параметр (?
) переменное Имя файла пользователя в этом Execute SQL Task (ParameterMapping
вкладки). Запрос корректно анализируется в задаче SQL Execute! Однако, когда я выполняю этот SQL Task, я получаю эту ошибку:
"Parameter name is unrecognized.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.
Эта ситуация довольно отличается, когда я загрузить данные из файлов XML (с помощью редактора исходного кода XML, с режимом доступа данных (XML-данных с переменной) и т. д.) в таблицы SQL Server. В нашем случае мы загружаем сам файл XML в таблицу SQL Server COLUMN с типом данных XML и получаем информацию о различных файлах XML, загруженных из папки. В результате я не уверен, как использовать переменную для запуска этого пакета.
Может ли кто-нибудь в первую очередь помочь мне в правильном параметризации имени файла?
И как настроить Контейнер ForEachLoop для чтения каждого файла из папки?
Я смущен тем, как использовать пользовательские переменные в этом сценарии.
Самый прямой способ заключается в использовании динамического SQL в цикле в то время. Получите список файлов из папки в таблицу temp, возьмите сначала, сгенерируйте запрос, запустите его на второй ... или даже сгенерируйте один большой оператор и запустите его сразу. – gofr1
Можете ли вы привести мне пример использования динамического SQL в таком сценарии? Я использовал Dynamic SQL в разных обстоятельствах, но не в таком случае. – user3812887
Я добавляю решение с динамическим SQL как ответ. – gofr1