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

Откуда:
Сообщений: 13
доброго времени суток коллеги. сваял скриптик загрузки файлов в SQL БД. при явном указании имени файлов в OPENROWSET все работает, но как только я пытаюсь подсовывать наименование файла динамически вываливается ошибка синтаксиса
сам скриптик:
declare
	 @n int ,
	 @i int,
	 @file varchar (13),
	 @q  varchar (250)													
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[#dt]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
	drop table #t 

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[#files]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
	drop table #files 


--drop table #t
--drop table #files


if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TaskMid]') 
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
delete  from  taskmid


create table #t (n varchar (200))
	insert #t exec  master..xp_cmdshell 'dir /s *.dbf D:\Выгрузка\*.dbf'

select right(n,12) from #t where n like '%dbf'

create table #files (id  int IDENTITY (1,1) NOT NULL, n varchar (200))
insert into #files  select right(n,12) from #t where n like '%dbf'

--select * from #files  where row_number() over(order by dtsname)


set @i=1
set @n= (select count(*)as n from #files)+1
while @i < @n
	begin
		set @file = (select cast(n as text) from #files where id = @i)
		set @q='select * from 000000001.dbf'-- + @file 
		print @q
	
	select *  Into #taskDbf  from 
		OpenRowset('MSDASQL.1', 'Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;DBQ=D:\Выгрузка',[b] @q)[/b] -- ошибка тут (((


	--	print('MSDASQL.1 '+ 'Driver={Microsoft dBase Driver(*.dbf)};DBQ=D:\Выгрузка;'+'SELECT * FROM 000000001.dbf')

		master..xp_cmdshell 'move D:\Выгрузка\'@file' D:\Загружено\'@file 


	set @file=''
	set @i = @i+1
	
	insert into taskmid  select * from  #taskDbf
	drop table #taskDbf
end
28 апр 12, 11:44    [12484329]     Ответить | Цитировать Сообщить модератору
 Re: Перебор файлов dbf. строка подключения выдает ошибку при использовании переменных  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
BOL OPENROWSET (Transact-SQL)
'datasource'
Строковая константа, соответствующая указанному источнику данных OLE DB.
...
'query'
Строковая константа, отправляемая поставщику и исполняемая им.
28 апр 12, 12:26    [12484599]     Ответить | Цитировать Сообщить модератору
 Re: Перебор файлов dbf. строка подключения выдает ошибку при использовании переменных  [new]
Virus квартирус
Member

Откуда: Москва
Сообщений: 41
Для таких случаев нужно сам скрипт, где используется openrowset, сделать динамическим.
Т.е. вот так:

Declare @Query varchar(8000)
Declare @q varchar(255)

Set @Query = 
'select *  Into #taskDbf  from 
OpenRowset(''MSDASQL.1'', ''Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;DBQ=D:\Выгрузка'',' + @q + ')'


Execute (@Query)
28 апр 12, 12:58    [12484866]     Ответить | Цитировать Сообщить модератору
 Re: Перебор файлов dbf. строка подключения выдает ошибку при использовании переменных  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Т.е. BULK INSERT, OpenRowSet, OpenQuery, OpenXml так же компилируются вместе с процедурой/скриптом.
Даже если вы догадаетесь до очевидной вещи, что перебирая файлы, переименовывать их под одно и тоже имя, то, если мне не изменяет память, также будут проблемы: Либо файл обязан существовать на время компиляции, либо вывалится ошибка изменения его структуры.
Но ещё не всё, даже если все файлы одинаковой структуры и можно хранить "болванку" для этапа компила, то всё равно можно нарваться на неприятный баг (кроме последней версии).

PS: Вообще-то имею привычку: максимально минимизировать динамизм. В закачках/выкачках При работе с файлами, процесс происходит в специально отведённом каталоге, в строго отведённых именах. Т.е. сразу отделяется нужное из окружающего (уже не нужно никаких фильтров, т.б. динамических) и легче проводить разбор полётов. Если присутствует несколько этапов, пусть каждый из них будет также отделён.
28 апр 12, 13:00    [12484882]     Ответить | Цитировать Сообщить модератору
 Re: Перебор файлов dbf. строка подключения выдает ошибку при использовании переменных  [new]
Wada
Member

Откуда:
Сообщений: 13
Virus квартирус, спасибо, сейчас попробую использовать Вашу подсказку
28 апр 12, 13:04    [12484917]     Ответить | Цитировать Сообщить модератору
 Re: Перебор файлов dbf. строка подключения выдает ошибку при использовании переменных  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Wada
insert #t exec  master..xp_cmdshell 'dir /s *.dbf D:\Выгрузка\*.dbf'
Ещё как совет.
Используйте *nix подход (хотя он повсеместен). Разделяйте всё от всего. Пусть всё состоит из маленьких независимых блоков.
В данном случае отделите работу с файлами (внешняя работа) от непосредственной закачки скулем.
DECLARE @CMD TABLE (Line Int IDENTITY PRIMARY KEY, CMD NVarChar(256))

INSERT @CMD(CMD) EXEC @Res = master.sys.xp_CmdShell 'List.cmd' -- 'List.bat', 'DownLoadAndList.cmd'
IF (@Res != 0) RAISERROR('CMD',18,1) -- Обработается в CATCH
-- ...
INSERT @CMD(CMD) EXEC @Res = master.sys.xp_CmdShell 'Clear.cmd' -- 'Clear.bat', 'UpLoadAndClear.cmd'
IF (@Res != 0) RAISERROR('CMD',18,2) -- Обработается в CATCH
28 апр 12, 13:19    [12485007]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить