Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 задать рабочую папку для osql  [new]
нуб987
Guest
стоит задача вызвать утилиту osql и выполнить скрипт из файла. Причем в этом скрипте есть операция 'bulk insert' из другого файла.
делаю примерно так:
osql -E -r1 -i "c:\utils\script.sql"


script.sql примерно такой:
use tempdb
go

CREATE TABLE #Table (
   Field1 varchar(1000) not NULL ,
   Field2 varchar(1000) not NULL ,
   Field3 varchar(1000) not NULL
) ON [PRIMARY]

BULK INSERT #Table 
   FROM 'MyTable.txt' -- вот здесь проблема
   -- если путь не указывать, то osql лезет в c:\windows\system32
   -- а если указать, то при смене рабочей папки (например, на d:\MyProject\) придется лезть в этот скрипт и менять здесь.
   WITH 
      (
         FIELDTERMINATOR = '\t',
         ROWTERMINATOR = '\n',
         CODEPAGE = 'RAW',
         FIRSTROW = 2
         --, LASTROW = 0
      )


Так вот. Проблема в том, что я не могу задать относительный путь к MyTable.txt.
Как бы я ни старался и не пытался задать рабочую папку, sql упорно лезет в c:\windows\system32.
Я уже и bat-файл создавал с таким содержанием:
cd c:\utils\
osql -E -r1 -i c:\utils\script.sql


И из powershell'а запускал такими строчками:
Param(
# этот путь может измениться!!!
$StartDir = "c:\utils\"
)
# и вот так
Set-Location $StartDir
@ osql "-E", "-r1", "-i", ($StartDir + "script.sql") > ($StartDir + "sqlout.log")

# и даже так с помощью -WorkingDirectory
Start-Process -FilePath "osql" -ArgumentList "-E", "-r1", "-i", ($StartDir + "script.sql") `
    -WorkingDirectory $StartDir -RedirectStandardError ($StartDir + "sqlerr.log") -RedirectStandardOutput ($StartDir + "sqlout.log") -Wait


проблема в том, что может измениться путь к скриптам (соот-но при запуске osql в параметрах указываем новый путь), а вот путь к файлу с данными (MyTable.txt) останется старый. И чтобы его сменить, потребуется редактировать скрипт.

как можно задать рабочую папку для osql?
3 окт 15, 09:57    [18230220]     Ответить | Цитировать Сообщить модератору
 Re: задать рабочую папку для osql  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
нуб987
как можно задать рабочую папку для osql?
А нельзя поменять osql на sqlcmd? У последнего в командной строке можно указывать переменные, которые потом можно использовать в скрипте. Примерно так:
sqlcmd -v path="C:\my\path" ...

А в скрипте:
... from '$(path)\MyTable.txt' ...
3 окт 15, 12:32    [18230495]     Ответить | Цитировать Сообщить модератору
 Re: задать рабочую папку для osql  [new]
нуб987
Guest
Serg_77m
А нельзя поменять osql на sqlcmd?

к сожалению нет. Используется СКЛ2000 и там есть только osql
3 окт 15, 19:45    [18231461]     Ответить | Цитировать Сообщить модератору
 Re: задать рабочую папку для osql  [new]
нуб987
Guest
сейчас еще эксперимент провел. SQL-скрипт написал такой:
rem пишем текущий путь, выполняя команду командной строки
!! echo %cd%
go

-- смотрим, куда полезет osql
exec  master..xp_cmdshell 'dir d*.dll'
go


Первая часть возвращает нормальный рабочий путь (c:\utils\). А вторая часть, где СКЛ-запрос, выдает c:\windows\system32

есть ли способы перенаправить СКЛ на нужную мне рабочую папку?
3 окт 15, 20:13    [18231539]     Ответить | Цитировать Сообщить модератору
 Re: задать рабочую папку для osql  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
нуб987
есть ли способы перенаправить СКЛ на нужную мне рабочую папку?
Вся проблема в том, что рабочая папка относится к клиентскому приложению, я запросы выполняет сервер, который ничего про неё не знает.
Можно ещё скрипт (или его часть) генерировать из .bat-файла, который потом скармливать osql. Так чтобы в результате нужный путь был жёстко вшит в текст запроса. Или выполнять запрос непосредственно из командной строки (с ключом -Q), если короткий.
4 окт 15, 19:26    [18233337]     Ответить | Цитировать Сообщить модератору
 Re: задать рабочую папку для osql  [new]
нуб987
Guest
Serg_77m
Можно ещё скрипт (или его часть) генерировать из .bat-файла, который потом скармливать osql.

не оч.понял, о чем речь. Можно примерчик какой-нибудь?
4 окт 15, 21:03    [18233566]     Ответить | Цитировать Сообщить модератору
 Re: задать рабочую папку для osql  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
нуб987
Serg_77m
Можно ещё скрипт (или его часть) генерировать из .bat-файла, который потом скармливать osql.

не оч.понял, о чем речь. Можно примерчик какой-нибудь?

@echo off
echo create table #Table (...) >%temp%\script.sql
echo bulk insert #Table from '%cd%\MyTable.txt' with (...) >>%temp%\script.sql
...
osql -E -i %temp%\script.sql
del %temp%\script.sql


Или весь скрипт уложить в командную строку:
osql -E -Q "bulk insert MyTable from '%cd%\MyTable.txt' with (...)"
4 окт 15, 21:11    [18233583]     Ответить | Цитировать Сообщить модератору
 Re: задать рабочую папку для osql  [new]
нуб987
Guest
Serg_77m, точно!
спасибо :)
4 окт 15, 21:32    [18233639]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить