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

Откуда: Armenia
Сообщений: 573
Привет.

Кто пробовал работать в T-SQL-е с колекциями FileSystemObject. Посмотрел
https://www.sql.ru/forum/actualthread.aspx?tid=124380 по логоике должно заработать, но нет.

DECLARE @object int
DECLARE @folder int
DECLARE @files int
DECLARE @file int
DECLARE @cnt int
DECLARE @hr int
DECLARE @name varchar(255),@src varchar(255),@desc varchar(255)


EXEC @hr = sp_OACreate 'Scripting.FileSystemObject', @object OUT
EXEC @hr = sp_OAMethod @object, 'GetFolder', @folder OUT, N'c:\'
EXEC @hr = sp_OAGetProperty @folder, 'Files',  @files OUT
EXEC @hr = sp_OAGetProperty @files, 'Item', @file OUT ,1
IF @hr <> 0 
BEGIN
   EXEC sp_OAGetErrorInfo @files, @src OUT, @desc OUT 
   SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
   RETURN
END
EXEC @hr = sp_OAGetProperty @file, 'Name',  @name OUT
PRINT @name

Возврашает

hrSource Description
0x80070057NULLNULL


Какие будут предложении.
14 апр 05, 20:29    [1469984]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
Коллекция типа Dictionary, а оно не имеет индексов. key должен иметь строковое значение, скорее всего, имя файла.
15 апр 05, 09:42    [1470534]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
Кроме проперти Item, есть еще метод Items, который возвращает массив. Вот в массиве уже можно применять индексы. Только надо выяснить, оно с нуля или единички начинается.
15 апр 05, 09:46    [1470544]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
Glory
Member

Откуда:
Сообщений: 104760
2 Hamlet
Убедитесь, что ваш подход работает собственно как VB Script.
А потом уже пробуйте перенести его в TSQL
15 апр 05, 10:25    [1470647]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
Hamlet
Member

Откуда: Armenia
Сообщений: 573
То что коллекция типа Dictionary и такой подход и на VBScript-е не праходит, это так, а вот метод Items у коллекции Files нет. Так вопрос как решить это остается открытым.
15 апр 05, 12:08    [1471059]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
Hamlet
Member

Откуда: Armenia
Сообщений: 573
Так что, выходит что нет варианта в T-SQL пройтись по обектам коллекции типа for each in????
15 апр 05, 17:26    [1472620]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
Glory
Member

Откуда:
Сообщений: 104760
Hamlet
Так что, выходит что нет варианта в T-SQL пройтись по обектам коллекции типа for each in????

А у вас есть рабочий VBScript, делающий тоже самое ?
15 апр 05, 17:27    [1472631]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
1024
Member

Откуда: Нижний Новгород
Сообщений: 14267
автор
Так что, выходит что нет варианта в T-SQL пройтись по обектам коллекции типа for each in????


нет

можно про просто xp_cmdshell 'dir /a'
15 апр 05, 17:37    [1472680]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
1024
Member

Откуда: Нижний Новгород
Сообщений: 14267
какая-то рожа к команде добавилась. Короче через командную строку help dir

гораздо проще чем FSO
15 апр 05, 17:38    [1472687]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
Hamlet
Member

Откуда: Armenia
Сообщений: 573
2Glory

Glory
Hamlet
Так что, выходит что нет варианта в T-SQL пройтись по обектам коллекции типа for each in????

А у вас есть рабочий VBScript, делающий тоже самое ?
15 апр 05, 18:05    [1472792]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
Glory
Member

Откуда:
Сообщений: 104760
2Hamlet
И как понимать ваш акцент на "for each in" ?
15 апр 05, 18:07    [1472803]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
Hamlet
Member

Откуда: Armenia
Сообщений: 573
set fso = CreateObject("Scripting.FileSystemObject")
Set fld = fso.GetFolder("c:\")
for each fl in fld.Files
    MsgBox fl.Name
next
15 апр 05, 18:12    [1472818]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
Glory
Member

Откуда:
Сообщений: 104760
set fso = CreateObject("Scripting.FileSystemObject")
Set fld = fso.GetFolder("c:\")
for each fl in fld.Files
    MsgBox fl.Name
next
Это не тот скрипт, который вы пробудете в TSQL

В TSQL вы пробуете что-то вроде
set fso = CreateObject("Scripting.FileSystemObject")
Set fld = fso.GetFolder("c:\")
for i=1 To fld.Files.Count
    MsgBox fld.Item(i).Name
next
Но такой VB Script нигде не роботает
0x80070057 - это Invalid parameter
По всей видимости конструкция for each из VB Script-а не использует коллецию Item для получения ссылки.

И все дело в том что Item хочет в качестве индекса не какой-то порядковый номер, а имя файла.
set fso = CreateObject("Scripting.FileSystemObject")
Set fld = fso.GetFolder("c:\")
for i=1 To fld.Files.Count
    MsgBox fld.Item("autoexec.bat").Name
next

Вот так вот получается
16 апр 05, 17:40    [1473925]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
выходит что перечилить коллекцию files не получится так как имена файлов не известны - их то и надо получить

а через TSQL for each - next сделать нельзя
28 сен 05, 10:59    [1917062]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
список файлов пока сделал так:

Create procedure "listxls"
as

create table #res (txt varchar(1000))
declare @parsestr  varchar(1000)
insert #res
EXEC master..xp_cmdshell 'dir "c:\base\Готовые графики\*.xls"'
declare @res table(dfiledate datetime , dfilesize varchar(9) , dfilename varchar(1000))
DECLARE res CURSOR FOR
SELECT * FROM #res
OPEN res
FETCH NEXT FROM res INTO @parsestr
WHILE (@@FETCH_STATUS = 0)
begin
if left(@parsestr,15) like '__.__.__  __:__%'
insert  @res (dfiledate,dfilesize,dfilename) 
	select  convert ( datetime, left(@parsestr,15),4),
		replace(SUBSTRING (@parsestr,16,24),' ',''),
		SUBSTRING (@parsestr,40,1000) 
 

FETCH NEXT FROM res INTO @parsestr
end

CLOSE res
DEALLOCATE res

select * from @res order by dfiledate desc

наверное не лучший способ, но другого (за исключением расширенной хранимки) пока не вижу
28 сен 05, 12:11    [1917496]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
ChA
Member

Откуда: Москва
Сообщений: 11047
АлексейК
наверное не лучший способ
Курсор-то зачем ?
28 сен 05, 15:03    [1918733]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
DIR дает всякую муру перед списком файлов - чтобы отсечь лишние
строки ...
28 сен 05, 15:13    [1918775]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
дествительно перемудрил

ALTER  procedure "listxls"
as
create table #res (txt varchar(1000))
insert #res
EXEC master..xp_cmdshell 'dir "c:\base\partners\Готовые графики\*.xls"'


select  convert ( datetime, left(txt,15),4) as dfiledate,
		replace(SUBSTRING (txt,16,24),' ','') as dfilesize,
		SUBSTRING (txt,40,1000) as dfilename
 
from #res 
where txt like '__.__.__  __:__%'
order by dfiledate

go
exec listxls
28 сен 05, 15:36    [1918896]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
ChA
Member

Откуда: Москва
Сообщений: 11047
АлексейК
дествительно перемудрил
Кстати, у команды DIR есть параметры. Настоятельно рекомендую с ними ознакомиться, будете приятно удивлены :)
28 сен 05, 15:42    [1918932]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
ChA
АлексейК
дествительно перемудрил
Кстати, у команды DIR есть параметры. Настоятельно рекомендую с ними ознакомиться, будете приятно удивлены :)


с PCXT c 1990 года, про параметры DIR в курсе,
тока на кой они мне, в данном случае мне надо только имена файлов, размер и дату в конкретной папке.


А вообще у меня такая запара случилась:
придумали админы DMZ сотворить и терминальный сервер в него поместить
а у меня на нем филиальские юзеры через аксесс с сервером работают.

все бы хорошо да только обязательное условие - нетбиосу нет - только tcpip к серверу баз данных, а у меня там архив аналитических отчетов в формате эксел, обновления клиентской части, шаблоны вордовских отчетов, хелпфайл наконец...

вот и переделываю теперь сервер баз данных в устройство для обзора папок и копирования файлов...
28 сен 05, 15:58    [1919031]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
ChA
Member

Откуда: Москва
Сообщений: 11047
Вам виднее, как лучше. Кстати, список файлов в каталоге можно было получить так
EXECUTE master.dbo.xp_dirtree N'C:\', 1, 1
28 сен 05, 16:15    [1919139]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
ChA
Вам виднее, как лучше. Кстати, список файлов в каталоге можно было получить так
EXECUTE master.dbo.xp_dirtree N'C:\', 1, 1


пркольная хранимка, но в BOL недокументирована
28 сен 05, 16:34    [1919282]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Работа в T-SQL с FileSystemObject  [new]
Андрей Усачёв
Member

Откуда: Рига, Латвия
Сообщений: 128
Табличная функция SQL Server, возвращающая список файлов с атрибутами в указанном каталоге.
SQL Server table valued function which returns file list with attributes in a specified folder.

create function GetDirDetails(@piFullPath nvarchar(128)) returns @FileDetails table
-- To install this function, please read the instructions below
(
	RowNum int identity(1,1) primary key clustered,
	Name nvarchar(128),
	Path nvarchar(128),
	ShortName nvarchar(12),
	ShortPath nvarchar(100),
	DateCreated datetime,
	DateLastAccessed datetime,
	DateLastModified datetime,
	Attributes int,
	ArchiveBit as case when aTTRIBUTES & 32 = 32 then 1 else 0 end,
	CompressedBit as case when aTTRIBUTES & 2048 = 2048 then 1 else 0 end,
	ReadOnlyBit as case when aTTRIBUTES & 1 = 1 then 1 else 0 end,
	Size int,
	Type nvarchar(100)
) as
begin
	declare @hr int
	declare @objScriptControl int
	declare @objFiles int
	declare @Count int
	declare @i int
	declare @objFile int

	exec @hr = sp_OACreate 'MSScriptControl.ScriptControl', @objScriptControl out
	exec @hr = sp_OASetProperty @objScriptControl, 'Language',  'VBScript' 
	exec @hr = sp_OAMethod @objScriptControl, 'AddCode', NULL, '
Function GetDirDetails(piFullPath)
	Set GetDirDetails = CreateObject("Scripting.Dictionary")
	i = 1

	For Each File In CreateObject("Scripting.FileSystemObject").GetFolder(piFullPath).Files
		GetDirDetails.Add i, File
		i = i + 1
	Next
End Function
	'
	exec @hr = sp_OAMethod @objScriptControl, 'Run', @objFiles out, 'GetDirDetails', @piFullPath
	exec @hr = sp_OADestroy @objScriptControl

	exec @hr = dbo.sp_OAMethod @objFiles, 'Count', @Count out
	select @i = 1

	while @i <= @Count
	begin
		exec @hr = dbo.sp_OAGetProperty @objFiles, 'Item', @objFile out, @i

		declare @Attributes int
		declare @DateCreated datetime
		declare @DateLastAccessed datetime
		declare @DateLastModified datetime
		declare @Name nvarchar(128)
		declare @Path nvarchar(128)
		declare @ShortName nvarchar(12)
		declare @ShortPath nvarchar(100)
		declare @Size int
		declare @Type nvarchar(100)

		exec @hr = dbo.sp_OAGetProperty @objFile, 'Path', @Path out
		exec @hr = dbo.sp_OAGetProperty @objFile, 'ShortPath', @ShortPath out
		exec @hr = dbo.sp_OAGetProperty @objFile, 'Name', @Name out
		exec @hr = dbo.sp_OAGetProperty @objFile, 'ShortName', @ShortName out
		exec @hr = dbo.sp_OAGetProperty @objFile, 'DateCreated', @DateCreated out
		exec @hr = dbo.sp_OAGetProperty @objFile, 'DateLastAccessed', @DateLastAccessed out
		exec @hr = dbo.sp_OAGetProperty @objFile, 'DateLastModified', @DateLastModified out
		exec @hr = dbo.sp_OAGetProperty @objFile, 'Attributes', @Attributes out
		exec @hr = dbo.sp_OAGetProperty @objFile, 'Size', @Size out
		exec @hr = dbo.sp_OAGetProperty @objFile, 'Type', @Type out

		insert into @FileDetails(Path, ShortPath, Name, ShortName, DateCreated, DateLastAccessed, DateLastModified, Attributes, Size, Type)
		values (@Path, @ShortPath, @Name, @ShortName, @DateCreated, @DateLastAccessed, @DateLastModified, @Attributes, @Size, @Type)

		exec @hr = sp_OADestroy @objFile

		select @i = @i + 1
	end

	exec @hr = sp_OADestroy @objFiles

	return
/*
To make this function work in 64-bit SQL Server:

1) import the following file into SQL Server's registry:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}]
"AppID"="{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}"

[HKEY_CLASSES_ROOT\Wow6432Node\AppID\{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}]
"DllSurrogate"=""

2) in dcomcnfg.exe
	-> Console Root -> Compionent Services -> Computers -> My Computer -> DCOM Config -> {0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}
	-> Properties -> Security -> Launch and Activation Permission -> Edit,
add the following permissions to Everyone:
* Local Launch
* Local Activation

3) execute the following SQL statement:

use master
grant exec on sp_OACreate to public
grant exec on sp_OASetProperty to public
grant exec on sp_OAGetProperty to public
grant exec on sp_OAMethod to public
grant exec on sp_OADestroy to public
*/
end
14 янв 16, 14:44    [18678705]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
MsDatabaseru
Member

Откуда: Hobby.MsDatabase.ru
Сообщений: 10937
по теме интересует есть ли способ получить бинарное содержимое файла в файловой системе если под админской или другой фиксированной учеткой доступа к файлу нет, но у юзера запускающего хранимку эти права есть (домен)
14 янв 16, 15:09    [18678888]     Ответить | Цитировать Сообщить модератору
 Re: Работа в T-SQL с FileSystemObject  [new]
Glory
Member

Откуда:
Сообщений: 104760
MsDatabaseru
по теме интересует есть ли способ получить бинарное содержимое файла в файловой системе если под админской или другой фиксированной учеткой доступа к файлу нет, но у юзера запускающего хранимку эти права есть


SELECT * FROM OPENROWSET(BULK N'C:\Text1.txt', SINGLE_BLOB) AS Document;

If a user uses a SQL Server login, the security profile of the SQL Server process account is used. In contrast, if a SQL Server user logs on by using Windows Authentication, the user can read only those files that can be accessed by the user account, regardless of the security profile of the SQL Server process.
14 янв 16, 15:16    [18678933]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить