这段语句执行时候为什么会出错,该如何修改?

suuuu 2010-08-26 05:26:50
With ADOQuery1 do
begin
Close;
Sql.Clear;
Sql.Add('if exists (select * from syscolumns where name= ''Is_Checked'' and id=object_id(''SPerson''))');
Sql.Add('Alter Table SPerson Drop column Is_Checked');
Sql.Add('Go');
Sql.Add('Alter Table SPerson add Is_Checked bit null');
Sql.Add('Go ');
Sql.Add('Update SPerson Set Is_Checked=0');
//Memo1.Clear;
//Memo1.Text:=Sql.Text;
ExecSQL;
end;

以前这样的用这样的语句执行查询,插入、删除、修改表中的内容都没有问题,里面的SQL语句单独在在SQL查询分析器中执行没有问题,但是用delphi去执行的时候会报错。请求路过高手帮助。感激不尽!
...全文
190 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
suuuu 2010-08-26
  • 打赏
  • 举报
回复
膜拜高手大哥,我去试试
kye_jufei 2010-08-26
  • 打赏
  • 举报
回复
補充:

    qry_BaseTemp.Close;
qry_BaseTemp.SQL.Clear;
qry_BaseTemp.SQL.Add( ' exec SP_HR_DAY_AUDIT ');//這裡加傳入參數
qry_BaseTemp.ExecSQL;
kye_jufei 2010-08-26
  • 打赏
  • 举报
回复
SQL存儲過程非常方便...
1.類似這樣:

USE [MES]
GO
/****** Object: StoredProcedure [dbo].[SP_HR_DAY_AUDIT] Script Date: 08/26/2010 18:42:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
/*
作者:天涯浪子一居士(有志者事竟成破釜沉舟百二秦关终属楚;苦心人天不负卧薪尝胆三千越甲可吞吴!)
时间:2010-08-26
地点:广东東莞
公司:昆盈電腦製品有限公司
功能:生成出勤快報
*/
-- =============================================

ALTER PROCEDURE [dbo].[SP_HR_DAY_AUDIT]
@rq smalldatetime,
@sWhere nvarchar(10)
AS
BEGIN
declare @ts int
select @ts=Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,@rq)+1, 0)))
declare @i1 int select @i1=1 declare @xx1 nvarchar(2)

delete from HR_DAY_AUDIT
while @i1<=@ts
begin
declare @kk1 int select @kk1=0 declare @kkk1 int select @kkk1=0
if @i1<=9 select @xx1='0'+CAST(@i1 as nvarchar(1))
else select @xx1=CAST(@i1 as nvarchar(2))
select @kk1=(select datepart(weekday, CONVERT(smalldatetime,CONVERT(nvarchar(8),@rq,120) +@xx1) ) - 1 )

if exists( select * from HR_HOLIDAYS where COLRQ=CONVERT(nvarchar(8),@rq,120) +@xx1 )
select @kkk1=1

INSERT INTO HR_DAY_AUDIT(COLRQ,COLCDN) VALUES( CONVERT(nvarchar(8),@rq,120) +@xx1,'>'+@sWhere)
select @i1=@i1+1
end

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[_HA1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[_HA1] --臨時表
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[_HA2]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[_HA2] --臨時表
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[HR_AUDI_DAY]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[HR_AUDI_DAY] --日稽核表


SELECT A.COLAID,A.COLRQ,A.SL,B.BM INTO _HA1 FROM
(
SELECT [COLAID],[COLRQ],SUM(COLJBT) AS SL
FROM [MES].[dbo].[HR_EMPLOYEE_DAY]
WHERE COLRQ>=CONVERT(nvarchar(8),@rq,120)+'01' AND
COLRQ<=CONVERT(nvarchar(8),@rq,120)+CONVERT(NVARCHAR(2),@ts)
GROUP BY [COLAID],[COLRQ]
) A LEFT JOIN Res_Hrd_Temp B ON A.COLAID=B.Account_Id
WHERE SL>CAST(@sWhere as float)

SELECT COLRQ,BM,COUNT(*) AS SL INTO _HA2 FROM _HA1 GROUP BY COLRQ,BM


declare @sql1_1 varchar(8000)
set @sql1_1 = 'select BM,'
select @sql1_1 = @sql1_1 + 'sum(case COLRQ when '''+COLRQ+'''then SL else 0 end) as '''+'THR'+RIGHT(COLRQ,2)+''','
from (select COLRQ from HR_DAY_AUDIT ) as a
select @sql1_1 = left(@sql1_1,len(@sql1_1)-1) + ' INTO HR_AUDI_DAY from _HA2 group by BM order by BM'
exec(@sql1_1)


if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[_HA1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[_HA1]
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[_HA2]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[_HA2]

--SELECT * FROM HR_AUDI_DAY

END


2.調用:

  try
if not Assigned(RES_LOADING_F) then
RES_LOADING_F:=TRES_LOADING_F.Create(Self);
RES_LOADING_F.Label1.Caption:='正在讀取數據......';
RES_LOADING_F.Show;
Screen.Cursor:=crSQLWait;
Application.ProcessMessages;
qry_BaseTemp.Close;
qry_BaseTemp.SQL.Clear;
qry_BaseTemp.SQL.Add( ' exec SP_HR_DAY_AUDIT ');
qry_BaseTemp.ExecSQL;
finally
Screen.Cursor:=crDefault;
FreeAndNil(RES_LOADING_F);
end;
suuuu 2010-08-26
  • 打赏
  • 举报
回复
客户有时候会很不专业,比如说执行一下脚本也不会。。。。。
亮剑_ 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 suuuu 的回复:]

我的这句话只需要在给客户安装程序的时候执行成功一次就行,所以存储过程就不需要了
[/Quote]
这样还不如直接写成SQL脚本文件来得方便
suuuu 2010-08-26
  • 打赏
  • 举报
回复
var
I:Integer;
begin
I:=0;
With ADOQuery1 do
begin
Close;
Sql.Clear;
Sql.Add('if exists (select * from syscolumns where name= ''Is_Checked'' and id=object_id(''ST_Person''))');
Try
Open;
I:=1;
Except
I:=2;
End;
if I=1 then
begin
Close;
Sql.Clear;
Sql.Add('Alter Table ST_Person Drop column Is_Checked');
ExecSQL;
end;
Close;
Sql.Clear;
Sql.Add('Alter Table ST_Person add Is_Checked bit null');
ExecSQL;

Close;
Sql.Clear;
Sql.Add('Update ST_Person Set Is_Checked=0');
ExecSQL;

//Sql.Add('Go');
//Sql.Add();
//Sql.Add('Go ');
//Sql.Add('');
//Memo1.Clear;
//Memo1.Text:=Sql.Text;

end;
end;

是这么个意思么?还是不行。。。。
SuperTitan001 2010-08-26
  • 打赏
  • 举报
回复
切换马甲失败!
SuperTitan001 2010-08-26
  • 打赏
  • 举报
回复
1:判断是否存在字段,用sql.open
2:如果不存在
alter table
execsql
alter table
execsql
update
execsql
suuuu 2010-08-26
  • 打赏
  • 举报
回复
把Go去掉也不行。。。
SuperTitan007 2010-08-26
  • 打赏
  • 举报
回复
那就改为4个语句,根据第一个语句的返回值来决定是否执行后面3个,不要一次执行,不要go
suuuu 2010-08-26
  • 打赏
  • 举报
回复
我的这句话只需要在给客户安装程序的时候执行成功一次就行,所以存储过程就不需要了
suuuu 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tjianliang 的回复:]
可写成存储过程,直接调用
[/Quote]
可以问下,这个是什么问题吗?
suuuu 2010-08-26
  • 打赏
  • 举报
回复
按照2楼的写法执行后会报错,说你改动的部分没有定义。
nkym0626 2010-08-26
  • 打赏
  • 举报
回复

With ADOQuery1 do
begin
Close;
Sql.Clear;
Sql.Add('if exists (select * from syscolumns where name= '+#13+Is_Checked+#13+' and id=object_id('+#13+SPerson+#13+'))');
Sql.Add('Alter Table SPerson Drop column Is_Checked');
Sql.Add('Go');
Sql.Add('Alter Table SPerson add Is_Checked bit null');
Sql.Add('Go ');
Sql.Add('Update SPerson Set Is_Checked=0');
//Memo1.Clear;
//Memo1.Text:=Sql.Text;
ExecSQL;
end;

亮剑_ 2010-08-26
  • 打赏
  • 举报
回复
可写成存储过程,直接调用

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧