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

Вниз

Как в MSSQL выполнисть несколько действий подряд разделенных go   Найти похожие ветки 

 
Павел Калугин ©   (2007-03-26 14:47) [0]

требуется выполнить скрипт вида

if exists (select 1
           from  sysindexes
          where  id    = object_id("t_oper")
           and   name  = "idx_t_oper_date"
           and   indid > 0
           and   indid < 255)
  drop index t_oper.idx_t_oper_date
go

if exists (select 1
           from  sysindexes
          where  id    = object_id("t_oper")
           and   name  = "idx_t_oper_dias_id"
           and   indid > 0
           and   indid < 255)
  drop index t_oper.idx_t_oper_dias_id
go

и так далее
делаю
     Memo1.Lines.LoadFromFile(InFileName);
     adcExec.CommandText:=memo1.Text;
     adcExec.Execute;

получаю ошибку

Line 14: Incorrect syntax near "go"
что я делаю не так?


 
Jan   (2007-03-26 14:53) [1]

go - это разделитель батчей QA, его хоть бла-бла назовите, а как Ваша програма его будет распознавать - Вам решать. Вам нужно самому парсить и выполнять отдельно скрипты.


 
Ega23 ©   (2007-03-26 14:55) [2]


> Павел Калугин ©   (26.03.07 14:47)


Тебе просто патч-скрипт, сгенерённый PD, надо прогнать?
Я для таких целей isql использую.

Либо go убери. Хотя я сомневаюсь, что поможет...


 
Павел Калугин ©   (2007-03-26 14:56) [3]

> [1] Jan   (26.03.07 14:53)

хмм. это то понятно. но нельзя ли явно указать в настройках соединения или ADOCommand? что бла-бла-бла понимать как разделитель?
Или данный способ работы предназначен исключительно для выполнения одной команды в один прием?


 
Павел Калугин ©   (2007-03-26 15:01) [4]

> [2] Ega23 ©   (26.03.07 14:55)

угу и не только его.
из-за бардака в системе делать такое приходится регулярно.
есть папка с стопкой файлов
их надо прогнать
придется текст попарсить малость, наверное. :)
бежать до go  исполнять, и читать после go следующий кусок и т.д.


> Я для таких целей isql использую.

то есть формируешь батник и передергиваешь его?


 
Jan   (2007-03-26 15:03) [5]


> то есть формируешь батник и передергиваешь его?

-c cmd_end

Specifies the command terminator. By default, commands are terminated and sent to SQL Server 2000 by entering GO on a line by itself. When you reset the command terminator, do not use Transact-SQL reserved words or characters that have special meaning to the operating system, whether preceded by a backslash or not.


 
Jan   (2007-03-26 15:04) [6]

но я бы рекомендовал юзать osql - она юникодная.


 
Ega23 ©   (2007-03-26 15:10) [7]


> то есть формируешь батник и передергиваешь его?


Ага. Что-то типа:


rem  Обновление объектов  (_RUNALL) БД БП - прогонка скриптов
rem
rem Внутренние переменные
set thedir=%~dp0
set sys32=%systemroot%\system32
set res=1
set mDeny=Отказ от установки
set mCont=, продолжить ?
set mInstErr=Oшибка установки

set SRV=%1
if "%1"=="~" set SRV=
if "%1"=="" set SRV=

set  DB=%2
if "%2"=="~" set DB=kedr
if "%2"=="" set  DB=kedr

set LOGIN=%3
if "%3"=="~" set LOGIN=kedr
if "%3"=="" set  LOGIN=kedr

set PWD=%4
if "%4"=="~" set PWD=
if "%4"==""  set  PWD=
if "%4"=="-" set  PWD=
rem PWD2 - для Call не должен быть пустым !!!
set PWD2=%PWD%
if "%PWD2%"=="" set  PWD2=~

set result=%5
if "%5"=="~" set result=%thedir%resultRunAll
if "%5"=="" set  result=%thedir%resultRunAll

copy nul %result%
rem set mes=Oбновить DB %DB% на сервере %SRV%  USER=%Login% Pwd= %PWD%  из %thedir% (файл результата - %result%)
rem hotmess /KC /T"%mes%" || goto fin

rem... проверить isql
set mes=Kлиентская часть MS SQL SERVER не установлена на %COMPUTERNAME%, работа с базой невозможна.
isql /? >NUL
set err=%ERRORLEVEL%
rem SIC !! 1,0
if "%err%"=="1" goto isqlend
if "%err%"=="0" goto isqlend
HotMess /L1 /KM /T"%mes%" & echo %mes%>>%result% & goto fin
:isqlend

rem... проверить коннект
set mes= Hет связи с [%Srv%].[%DB%] (%LOGIN%.%PWD%)
isql /b /S%SRV% /U%LOGIN% /P%PWD% /d%DB%  -Q"select top 1 1 from sysobjects"
if  not "%ERRORLEVEL%"=="0" (HotMess /L1 /KM /T"%mes%" & echo %mes%>>%result% & goto fin)

echo Обновление объектов БД  > %result%
for /F "tokens=2" %%d in ("date /t") do set today=%%d
for /F "tokens=*" %%d in ("time /t") do set now=%%d
echo Hачало: %today% в %now% >>%result%

rem 2002-01-31 Установить №версии - ПОКА НЕТ !!!!
GOTO endrelnr
set relfile=%thedir%..\release.###
FOR /F "tokens=*" %%a in (%relfile%) do set relnam=%%a & goto end1
:end1
rem HotMess /L%ERRORLEVEL% /KC /T"#релиза: %relnam%"||goto fin
if "%relnam%"=="" errelnr
set err=0
set sqls=update paramsGlb set SysVer="%relnam%"
set cmds=isql /n /m0 /S%Srv% /d%DB% /U%LOGIN% /P%PWD%  /Q"%sqls%"
cmd /c %cmds%
set err=%ERRORLEVEL%
if %err% NEQ 0 goto errelnr
echo Bерсия релиза - %relnam% >>%result%
goto endrelnr
:errelnr
echo Bерсия релиза неопределена >>%result%
goto endrelnr
:endrelnr

rem ************* Define ServerName
rem set  ServNam=%1
rem *************
@echo SQL SERVER -  %SRV%
@echo SQL SERVER -  %SRV% >>%result%
@echo DataBase   -  %DB%
@echo DataBase   -  %DB% >>%result%

ChCpISQL.exe WIN >> %result%
echo =====  >>%result%
rem  ................................................
rem  .... Running scripts
rem  ................................................

isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\q_PatchARM.sql      >>%result%  

isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\S_ToolBarConfig.sql      >>%result%  

isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\S_TableProc.sql      >>%result%  
isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\S_ParamsProc.sql      >>%result%  
isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\S_ImageProc.sql      >>%result%  
isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\S_RTTIProc.sql      >>%result%  
isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\S_RTTIServ.sql      >>%result%  
isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\S_CfgCOMProc.sql      >>%result%  
isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\S_CfgCOMUnitsEdit.sql      >>%result%  
isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\S_TextStylesProc.sql      >>%result%  
isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\S_TaskProc.sql      >>%result%  
isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\S_PhsConfigProc.sql      >>%result%  
isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\S_ReplicationProc.sql      >>%result%  
isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\S_TVProc.sql      >>%result%  
isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\S_RelayProc.sql      >>%result%  
isql /n /b /m0 /S%SRV% /U%LOGIN% /P%PWD% /d%DB% /i %thedir%\S_FramesProc.sql      >>%result%  
.......
rem  ................................................
rem  .... End Running scripts
rem  ................................................

for /F "tokens=2" %%d in ("date /t") do set today=%%d
for /F "tokens=*" %%d in ("time /t") do set now=%%d
echo ===== Окончание: %today% в %now% >>%result%
:fin



 
Павел Калугин ©   (2007-03-26 16:03) [8]

> [7] Ega23 ©   (26.03.07 15:10)

Я предпочел выкрутится иначе.
исходя из того, что кроме разделителя в этой строке ничего не пишу


Memo1.Lines.LoadFromFile(InFileName);
     adcExec.SQL.Clear;

       for j := 0 to memo1.Lines.Count - 1 do
       begin
         if trim(AnsiUpperCase(Memo1.Lines[j]))="GO" then
         begin
          //  ShowMessage(adcExec.SQL.Text);
            adcExec.ExecSQL;
            adcExec.SQL.Clear;
         end
         else
             adcExec.SQL.Add(memo1.Lines[j]);
       end;
       if Length(trim(adcExec.SQL.Text))>0
         then  adcExec.ExecSQL;
       adcExec.SQL.Clear;


 
Плохиш ©   (2007-03-26 16:08) [9]


> Павел Калугин ©   (26.03.07 14:56) [3]
> > [1] Jan   (26.03.07 14:53)
>
> хмм. это то понятно. но нельзя ли явно указать в настройках
> соединения или ADOCommand?

ADO ничего об этом  "go" не знает.


 
Johnmen ©   (2007-03-26 16:33) [10]


> Line 14: Incorrect syntax near "go"что я делаю не так?

Выкини go и живи счастливо...


 
Jan   (2007-03-26 16:35) [11]


> Выкини go и живи счастливо...

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


 
Ega23 ©   (2007-03-26 16:41) [12]


> Выкини go и живи счастливо...


Операции с таблицами (ХП, вьюхами, триггерами и функциями), такие как CREATE, ALTER или DROP, AFAIR, должны производиться отдельной транзакцией.


 
Johnmen ©   (2007-03-26 16:47) [13]


> незя, попробуй чего-нить сделать а потом сразу create....

Мона. Я выпил пива и потом сразу create. Нормально...

> Операции с таблицами (ХП, вьюхами, триггерами и функциями),
>  такие как CREATE, ALTER или DROP, AFAIR, должны производиться
> отдельной транзакцией.

И что?
Скрипт-то отрабатывает.


 
Павел Калугин ©   (2007-03-26 16:51) [14]

> [10] Johnmen ©   (26.03.07 16:33)

Да ладно, я просто по GO  порезал скрипт на куски, и пес с ним..
Была надежда что можно явно указать, что считать разделителем. Ну если нет, так нет.


 
Johnmen ©   (2007-03-26 16:56) [15]


> Павел Калугин ©   (26.03.07 16:51) [14]
> Да ладно, я просто по GO  порезал скрипт на куски, и пес с ним..

Зачем порезал? А ладно, пес с ним, действительно...


 
sniknik ©   (2007-03-26 17:11) [16]

> Да ладно, я просто по GO  порезал скрипт на куски
и правильно, GO показывает, что команды скрипта до него требуют завершения до выполнения следующих, т.е. например создание таблицы до обращения к ней которое теоретически может быть следующей командой и также теоретически может начать выполняться раньше чем таблица будет создана. в многозадачной то среде неудивительно.
вот и ставят разделители для блоков команд которые нужно выполнять отдельными кусками, ждать завершения (а вдруг глюк)  и только после этого выполнять следующую "порцию". другое дело иногда ставят немного параноидально... ну да беды в этом нет, мизер в потери скорости.
ну и т.к. GO не является командой SQL, а является просто меткой для QA, то и в ADOCommand его как разделитель ну никак нельзя указать... для QA метка, а для какогонибудь хитрого диалекта какогонибудь оракла (например) вполне даже себе команда SQL... и что же теперь не работать с ним? пусть уж лучше программисты сами парсируют и выполняют скрипт также как QA, не перетрудятся.

> Зачем порезал?
чтобы не ломать голову откуда вдруг то есть то нет ошибки.


 
Jan   (2007-03-26 17:15) [17]


> Скрипт-то отрабатывает.

а так?

if object_id("sp_1") is null
begin
create procedure [sp_1] AS
begin
 select getdate()
end
end


 
Павел Калугин ©   (2007-03-26 17:21) [18]

> [15] Johnmen ©   (26.03.07 16:56)

Как зачем? чтобы отдельно исполнять каждый пакет.
файл гружу в Memo
собираю то что до GO
выполняю
беру след кусок и до конца.
удобно..
пока у меня строке кроме GO ничего нету:)


 
Плохиш ©   (2007-03-26 17:41) [19]


> файл гружу в Memo

Чем TStringList не устроил? Привычка кидать компоменты?


 
Павел Калугин ©   (2007-03-27 10:35) [20]

> [19] Плохиш ©   (26.03.07 17:41)

именно.
Ибо в процессе отладки есть желание посмотреть что получается.  А потом менять лень:)



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

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

Наверх




Память: 0.53 MB
Время: 0.02 c
2-1179843409
programmist87
2007-05-22 18:16
2007.06.17
Журнал Internet Explorer


2-1180337152
waif
2007-05-28 11:25
2007.06.17
Ordinal type required


6-1164800741
Term
2006-11-29 14:45
2007.06.17
вопрос по TServerSocket


2-1180081348
Vitaliy12
2007-05-25 12:22
2007.06.17
ADOQUERY - Где я не прав?


2-1180414270
Firefly
2007-05-29 08:51
2007.06.17
Работа с TreeView