Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.06.17;
Скачать: [xml.tar.bz2];

Вниз

Как в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.038 c
2-1180013510
Serega_61
2007-05-24 17:31
2007.06.17
Вложенные формы


2-1179903497
RomanLN
2007-05-23 10:58
2007.06.17
как в DBgrib вять(присвоить) содержимое нужной ячейки


1-1177302041
Vidog@mobzone.org
2007-04-23 08:20
2007.06.17
Ресурсы в программе


1-1176890879
Ice2
2007-04-18 14:07
2007.06.17
обрезать начало строки


2-1180080747
delphino
2007-05-25 12:12
2007.06.17
Можно ли объединить два фильтра





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский