在Delphi中如何执行带GO的语句(50分)

  • 主题发起人 主题发起人 superego
  • 开始时间 开始时间
S

superego

Unregistered / Unconfirmed
GUEST, unregistred user!
请问有哪位大侠能告诉我在Delphi中如何执行带GO的语句,下面的这个带有GO的语句为何不能执行呢?
with Adoqry_add do
begin
SQL.Clear;
SQL.Add(' BEGIN TRANSACTION DBCC checktable('''+Trim(edt_table.Text)+''') ');
SQL.Add(' DBCC checktable('''+Trim(edt_table.Text)+''') WITH ALL_ERRORMSGS ');
SQL.Add(' DBCC CHECKTABLE (lssj,repair_allow_data_loss) ');
SQL.Add(' DBCC DBREINDEX('''+Trim(edt_table.Text)+''') ');
SQL.Add(' GO ');
SQL.Add(' exec sp_dboption '''+Acnn.DefaultDatabase +''', ''single user'', true ');
SQL.Add(' DBCC CHECKDB('''+Acnn.DefaultDatabase +''', REPAIR_ALLOW_DATA_LOSS) ');
SQL.Add(' GO ');
SQL.Add(' exec sp_dboption '''+Acnn.DefaultDatabase +''',''single user'', false ');
SQL.Add(' GO COMMIT');
ExecSQL;
end;
 
为什么要GO呢,DELPHI本来就是一个一个提交的。
或者在中间直接;execsql也可以啊
 
Delphi不技持Go的
 
不需要这样处理。
delphi不支持。
其实你可以这样变通一下,
with Adoqry_add do
begin
SQL.Clear;
SQL.Add(' BEGIN TRANSACTION DBCC checktable('''+Trim(edt_table.Text)+''') ');
SQL.Add(' DBCC checktable('''+Trim(edt_table.Text)+''') WITH ALL_ERRORMSGS ');
SQL.Add(' DBCC CHECKTABLE (lssj,repair_allow_data_loss) ');
SQL.Add(' DBCC DBREINDEX('''+Trim(edt_table.Text)+''') ');
ExecSQL;
SQL.Clear;
SQL.Add(' exec sp_dboption '''+Acnn.DefaultDatabase +''', ''single user'', true ');
SQL.Add(' DBCC CHECKDB('''+Acnn.DefaultDatabase +''', REPAIR_ALLOW_DATA_LOSS) ');
ExecSQL;
SQL.Clear;
SQL.Add(' exec sp_dboption '''+Acnn.DefaultDatabase +''',''single user'', false ');
ExecSQL;
SQL.Clear;
SQL.Add(' COMMIT');
ExecSQL;
end;
 
只要把有GO的去掉,其他的一起提交執行就可以了
 
像zywcd说的这种变通方法是在这个SQL是不能这样用的,还有好比我要修改一个上千条的存储过程里边上百个GO语句这样变通是不行。请楼主给予指教
 
boldfake说只要把有GO的去掉,其他的一起提交執行就可以了
如果GO去掉有用,我就不会提出来这个问题了呀
 
我曾经这样做过,
把存储过程取出来,然后搜索里面的"GO",
遇到GO的地方就分开,让代码自己来处理。
比如这样
var tsql:widestring;//可能会有几K的长度
repeat
adocommand1.commandtext:=copy(tsql,1,pos(tsql,'GO')-1);
adocommand1.Execute;
tsql:=copy(tsql,pos(tsql,'GO')+2,length(tsql)

until length(trim(tsql))=0;
 
遇到GO 就去掉.从 ; 来分开
 
这位QSmile兄弟,我要去掉GO解决得了我下面的代码就好了,再加上我想Delphi一定有这方面的考虑的。ADO功能是强大的,我深信一定有人知道怎样能执行带GO的SQL语句
with Adoqry_add do
begin
SQL.Clear;
SQL.Add(' BEGIN TRANSACTION DBCC checktable('''+Trim(edt_table.Text)+''') ');
SQL.Add(' DBCC checktable('''+Trim(edt_table.Text)+''') WITH ALL_ERRORMSGS ');
SQL.Add(' DBCC CHECKTABLE (lssj,repair_allow_data_loss) ');
SQL.Add(' DBCC DBREINDEX('''+Trim(edt_table.Text)+''') ');
SQL.Add(' GO ');
SQL.Add(' exec sp_dboption '''+Acnn.DefaultDatabase +''', ''single user'', true ');
SQL.Add(' DBCC CHECKDB('''+Acnn.DefaultDatabase +''', REPAIR_ALLOW_DATA_LOSS) ');
SQL.Add(' GO ');
SQL.Add(' exec sp_dboption '''+Acnn.DefaultDatabase +''',''single user'', false ');
SQL.Add(' GO COMMIT');
ExecSQL;
end;
 
这位朋友真奇怪,GO在SQL是结束命令呀 又不是调用 你这样还不如直接在企业管理器里用存储呢
 
wo88786705兄弟,如果所有的东西都要用企业管理器里用存储过程来搞,那还用这么麻烦吗?只是有些时候SQL语句中的所带的GO是不能取消的,这种情况该如何解决了,如果是一般的SQL语句我就用不上这么麻烦来加上GO语句了,还是想请楼主给我个好的解决方法
 
就是不能有go,你去掉go就ok了
 
你新建一个存储过程,专门运行这种变态语句不就行了?
 
参考我的控件中的部分代码:
procedure TMyCommonLib.ExecSQLScript(Script: string);
var
I: integer;
AList: TStringList;
S: string;
begin
AList := TStringList.Create;
try
AList := Self.ParseSQL(Script);
for I := 0 to AList.Count - 1 do
begin
S := AList;
if Trim(S) <> '' then
Self.ExecADOQuery2(S);
end;
finally
AList.Free;
end;
end;

function TMyCommonLib.ParseSQL(Script: string): TStringList;
function GetValidGoPos(S: string): integer;
label xd;
var
T: string;
I, pLen: integer;
A, B: string;
LeftOK, RightOk: boolean;
LeftChar1, RightChar1, LeftChar2, RightChar2: string;
begin
LeftOK := False;
RightOK := False;
T := UpperCase(S);
PLen := 0;
begin
xd:
I := Plen + Pos('GO', T);
if Pos('GO', T) > 0 then
begin
if I > 0 then
begin
A := Copy(T, 1, I - 1);

B := Copy(T, I + 2, Length(T));
PLen := Length(T) - Length(B);
T := B;
LeftChar1 := Copy(A, Length(A), 1);
LeftChar2 := Copy(A, Length(A)-1, 1);
RightChar1 := Copy(B, 1, 1);
RightChar2 := Copy(B, 2, 1);
if (LeftChar1='') or (LeftChar1=#10) or (LeftChar1=' ') or (LeftChar1=#13) then
LeftOK := True;
if (RightChar1='') or (RightChar1= ' ') or (RightChar1=#13) then
RightOK := True;
if LeftOK and RightOK then
begin
Result := I;
Exit;
end
else
goto xd;
end
end
end;
end;
var
I, J: integer;
S, S2, S3: string;
AList: TStringList;
begin
AList := TStringList.Create;
S := UpperCase(Script);
S2 := Script;
I := GetValidGoPos(S);
if I = 0 then
AList.Add(Script)
else
begin
J := I;
while J > 0 do
begin
S3 := copy(S2, 1, J - 1); //当前要执行的SQL语句
AList.Add(S3);
S2 := copy(S2, J+3, Length(S2)-(J+3)+1);
S := UpperCase(S2);
J := GetValidGoPos(S);
end;
if Length(Trim(S2)) > 0 then
AList.Add(S2);
end;
Result := AList;
end;

procedure TMyCommonLib.ExecADOQuery2(Command: string);
var
tmp: TADOQuery;
begin
if Assigned(FConnection) then
begin
tmp := TADOQuery.Create(nil);
try
tmp.Connection := FConnection;
tmp.ParamCheck := False;
tmp.CommandTimeout := 0;
Command := Trim(Command);
try
Self.ExecADOQuery(tmp, Command);
except
ShowMessage(command);
end;
finally
tmp.Free;
end;
end
else
MessageDlg('Missing ADOConnectin property!', mtInformation, [MBOK], 0);
end;
 
后退
顶部