Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Импорт всех xml из папки  [new]
sonwookong
Member

Откуда:
Сообщений: 8
Необходимо обработать все файлы xml в папке.
Навоял код (часть его):
DECLARE @xml XML, @idnt_id as UNIQUEIDENTIFIER, @nid_pepl as UNIQUEIDENTIFIER, @nid_clin as UNIQUEIDENTIFIER

IF OBJECT_ID('tempdb..#fxml') IS NOT NULL 
	DROP TABLE #fxml 

CREATE TABLE #fxml (	
	fxml_number	varchar(30),
	fxml_fam	varchar(100),
	fxml_imy	varchar(100),
	fxml_otch	varchar(100),
	fxml_phone	varchar(50),
	fxml_pin	varchar(30))

declare @t table (line nvarchar(max))
declare @cmd sysname
declare @val nvarchar(max), @sql nvarchar(max)

set @val='\\server\xml\'

set @cmd='dir /B /A:-D "' + @val  + '*.xml"'
insert into @t exec xp_cmdshell @cmd

declare cur_fil cursor local scroll
for select @val+line 'line' from @t where line is not null
	
declare @fil VARCHAR(max)

open cur_fil
fetch first from cur_fil into @fil
while @@fetch_status=0
begin

	set @sql='SELECT @xml = x.y FROM OPENROWSET( BULK'''+ @fil+''', SINGLE_CLOB ) x(y)'

	exec sp_executesql @sql, @xml output
		
	insert into #fxml (fxml_number,fxml_imy,fxml_phone,fxml_pin)
	SELECT 
		c.c.value('(./number)[1]', 'varchar(30)') as number,
		c.c.value('(./name)[1]', 'varCHAR(100)') as imya,
		c.c.value('(./phone)[1]', 'varCHAR(50)') as phone,
		c.c.value('(./pin)[1]', 'varCHAR(30)') as pin
	FROM @xml.nodes('/card') AS c(c)
...
...


споткнулся об строку exec sp_executesql @sql, @xml output как правильно написать параметры EXECа чтобы объект @xml работал в следующем запросе?
21 ноя 14, 15:49    [16886175]     Ответить | Цитировать Сообщить модератору
 Re: Импорт всех xml из папки  [new]
Glory
Member

Откуда:
Сообщений: 104751
declare @x nvarchar(max), @file nvarchar(100), @sql nvarchar(max)
set @file = N'C:\x.txt'
SET @sql = N'SET @y = (SELECT * FROM OPENROWSET(BULK N'''+@file+''', SINGLE_NCLOB) as x)'
exec sp_executesql @sql, N'@y nvarchar(max) output', @y = @x output
select @x
21 ноя 14, 15:52    [16886205]     Ответить | Цитировать Сообщить модератору
 Re: Импорт всех xml из папки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37225
Это все написано в документации же: http://msdn.microsoft.com/ru-ru/library/ms188001.aspx
21 ноя 14, 16:00    [16886266]     Ответить | Цитировать Сообщить модератору
 Re: Импорт всех xml из папки  [new]
sonwookong
Member

Откуда:
Сообщений: 8
Переменная @x не проходит в .nodes надо тип XML.

Выкрутился - вогнал весь запрос в переменную:
	set @sql='DECLARE @xml XML; SELECT @xml = x.y FROM OPENROWSET( BULK'''+ @fil+''', SINGLE_CLOB ) x(y); insert into #fxml (fxml_number,	fxml_imy,fxml_phone,fxml_pin) '
	set @sql=@sql+'SELECT ' 
	set @sql=@sql+'c.c.value(''(./number)[1]'', ''varchar(30)'') as number, '
	set @sql=@sql+'c.c.value(''(./name)[1]'', ''varCHAR(100)'') as imya, '
	set @sql=@sql+'c.c.value(''(./phone)[1]'', ''varCHAR(50)'') as phone, '
	set @sql=@sql+'c.c.value(''(./pin)[1]'', ''varCHAR(30)'') as pin '
	set @sql=@sql+'FROM @xml.nodes(''/card'') AS c(c)'

	exec (@sql)


Всем спасибо!
тему можно закрыть
21 ноя 14, 16:22    [16886406]     Ответить | Цитировать Сообщить модератору
 Re: Импорт всех xml из папки  [new]
Glory
Member

Откуда:
Сообщений: 104751
sonwookong
Выкрутился - вогнал весь запрос в переменную:

Мда уж

declare @x xml, @file nvarchar(100), @sql nvarchar(max)
set @file = N'C:\x.txt'
SET @sql = N'SET @y = (SELECT * FROM OPENROWSET(BULK N'''+@file+''', SINGLE_CLOB) as x)'
exec sp_executesql @sql, N'@y xml output', @y = @x output
select @x
21 ноя 14, 16:31    [16886488]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить