Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.02.12;
Скачать: CL | DM;

Вниз

Подскажите с внешними командами с файлами к MSSQL(копировать)   Найти похожие ветки 

 
OW ©   (2011-10-26 12:13) [0]

Читаю:
http://msdn.microsoft.com/en-us/library/ms175046.aspx
...
USE master;
EXEC xp_cmdshell "copy c:\SQLbcks\AdvWorks.bck
   \\server2\backups\SQLbcks, NO_OUTPUT";
GO
...

Пишу:

declare @FileFullName varchar(100), @CMD varchar(200),
       @ResultVar int;
set @FileFullName = "C:\boot.ini";
EXEC Master.dbo.xp_fileexist @FileFullName, @ResultVar OUT
if @ResultVar = 1
begin
 print "НАЙДЕН!"
 set @CMD = "copy " + @FileFullName + " D:\boot.ini"
 print @CMD
 EXEC master.dbo.xp_cmdshell @CMD
end else
 Print "Не найден еще в xp_fileexist"


Messages:
---------
(1 row(s) affected)
НАЙДЕН!
copy C:\boot.ini D:\boot.ini
(4 row(s) affected)

Results:
-------------
C:\boot.ini
The system cannot find the file specified.
       0 file(s) copied.
NULL

Почему не находит? (Файл точно есть, да и первая ф-ция его нашла же)


 
Медвежонок Пятачок ©   (2011-10-26 12:39) [1]

а ты уверен что не найдено именно то, что ты думаешь, а не другое?
например "copy"?


 
OW ©   (2011-10-26 12:42) [2]

>> Медвежонок Пятачок ©   (26.10.11 12:39) [1]
так пишет же..

> Results:
> -------------
> C:\boot.ini
> The system cannot find the file specified.


ничего не понимаю.
run-cmd-ENTER
C:\>copy c:\1.txt d:\2.txt
Скопировано файлов:         1.

d:\2.txt стираю, пишу

 declare @CMD varchar(200)
 set @CMD = "copy c:\1.txt d:\2.txt"
 print @CMD
 EXEC master.dbo.xp_cmdshell @CMD
запускаю

Messages
---------
copy c:\1.txt d:\2.txt

(2 row(s) affected)

Results
---------
The system cannot find the file specified.
NULL


 
OW ©   (2011-10-26 12:47) [3]

БЛИН!!!!
ОН ищет же его на СЕРВЕРЕ!!!!
создал там, на C: 1.txt и вот:
copy c:\1.txt d:\2.txt

(2 row(s) affected)

       1 file(s) copied.
NULL


 
OW ©   (2011-10-26 12:48) [4]

стоп..
а как же
Master.dbo.xp_fileexist
находил..


 
Ega23 ©   (2011-10-26 12:49) [5]


> ОН ищет же его на СЕРВЕРЕ!!!!


Естественно.
Но можно и сетевые пути указывать, в том файле как раз есть.


 
Медвежонок Пятачок ©   (2011-10-26 12:49) [6]

а где же он его может искать если не на сервере?!
сервер же сам на сервере работает.


 
Ega23 ©   (2011-10-26 12:54) [7]

http://msdn.microsoft.com/ru-ru/library/ms187389%28v=SQL.90%29.aspx

Я на минуточку не понял: а что такое xp_fileexist


 
OW ©   (2011-10-26 13:01) [8]

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


> Я на минуточку не понял: а что такое xp_fileexist

Процедурка тоже. Из разряда xp_cmdshell
Работает похоже только иначе.. Она смотрит мои файлы, на машине где запускается. (по всему выходит, что именно так. Находит же на локалке моей файлы. И путала, коза :) )


 
Ega23 ©   (2011-10-26 13:10) [9]


> Процедурка тоже. Из разряда xp_cmdshell


Я понял, что процедурка. Почему в BOL не описана?


 
OW ©   (2011-10-26 13:14) [10]

Ну...недокументированная, очевидно, значит :)

http://blogs.msdn.com/b/sathishcg/archive/2006/11/24/undocumented-sql-server-2000-functions.aspx


 
Ega23 ©   (2011-10-26 13:18) [11]

Покажи, щито возвращает
EXEC Master.dbo.xp_fileexist "C:\boot.ini"


 
OW ©   (2011-10-26 13:40) [12]

File Exists File is a Directory Parent Directory Exists
----------- ------------------- -----------------------
1           0                   1

(1 row(s) affected)


 
OW ©   (2011-10-26 13:46) [13]


> OW ©   (26.10.11 13:40) [12]

причем, C:\boot.ini на сервере отсутствует
он только на моей машине


 
Ega23 ©   (2011-10-26 13:51) [14]

Чудесато...


 
Ega23 ©   (2011-10-26 13:52) [15]

ИМХО. Напиши CMD-скрипт и дёргай его.


 
OW ©   (2011-10-26 17:59) [16]

да не, все правильно и все работает.

надо просто помнить про особенность.
Они ее не документировали, так что имеет право на такое поведение.

или понаписал тут уже
ALTER FUNCTION [dbo].[DeleteFile]
(
@FileSrc VarChar(120)
)
RETURNS int
AS
BEGIN
 declare @CMD varChar(255), @Result int;
 set @CMD = "erase " + @FileSrc;
 EXEC @Result = xp_cmdshell @CMD, NO_OUTPUT;
 Return @Result;
END
или
ALTER FUNCTION [dbo].[CopyFile]
(
@FileSrc VarChar(120), @FileDst VarChar(120)
)
RETURNS int
AS
BEGIN
 declare @CMD varChar(255), @Result int;
 set @CMD = "copy " + @FileSrc + " " + @FileDst;
 --print @CMD;
 EXEC @Result = xp_cmdshell @CMD, NO_OUTPUT;
 Return @Result;
END
или
ALTER FUNCTION [dbo].[FileExists]
(
@FileFullName varchar(255)
)
RETURNS int
AS
BEGIN
 DECLARE @ResultVar int;
 EXEC Master.dbo.xp_fileexist @FileFullName, @ResultVar OUT
 RETURN @ResultVar;
END

зато вспомнил, и удобно стало, и на Delphi похоже стало :)

 while (dbo.FileExists("w:\scards_nas_1.txt") = 1)
 begin
   waitfor delay "00:00:59"; -- ждать минуту. Надо синхронно положить файлы!
 end;

   set @Result = dbo.CopyFile("D:\buffer\scards_nas_1.txt", "w:\scards_nas_1.txt");
   if @Result = 0
   begin
      set @Result = dbo.DeleteFile("D:\EXPORT\buffer\scards_nas_1.txt");


 
OW ©   (2011-10-27 19:37) [17]

Короче, еще засада была
На сетевую шару не копирует, оказывается
Спасибо Ега, напомнил как надо писать.
Полный вариант таков, может кому надо будет

 declare @CMD varChar(255)

 set @CMD = "net use w: /delete";
 EXEC  @RES = xp_cmdshell @CMD, NO_OUTPUT

 set @CMD = " net use w: \\192.168.8.30\exchange\io password /user:username /persistent:yes";
 EXEC  xp_cmdshell @CMD

 set @CMD = "copy D:\1.txt \\192.168.8.30\exchange\io\1.txt";
 EXEC  xp_cmdshell @CMD



Страницы: 1 вся ветка

Текущий архив: 2012.02.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.009 c
15-1319315405
Юрий
2011-10-23 00:30
2012.02.12
С днем рождения ! 23 октября 2011 воскресенье


15-1319187613
George
2011-10-21 13:00
2012.02.12
Расчет индекса Хирша


2-1320666805
lewka
2011-11-07 14:53
2012.02.12
Выборка из базы dbf


2-1320150226
начинающий_
2011-11-01 15:23
2012.02.12
конструктор / деструктор


15-1319421182
Nic
2011-10-24 05:53
2012.02.12
Автоматическая сортировка DBGridEh