Форум: "Базы";
Текущий архив: 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