sql server批量插入中使用变量

yamsan 2005-06-08 05:05:45
一下语句从两个表提取数据插入到另外一个表,并且jhsl由一个变量li_quantity得到.该语句我在用ASA数据库时没有问题,用sql server 2000数据库时错误。提示:SQLSTATE = 37000
[Microsoft][ODBC SQL Server Driver]语法错误或违反访问规则。如果语句中没有:li_quantity可以。sql server 这种情况是怎么使用变量的?
insert into a( lj_id, gx_id, jhsl, jhxm_id )
SELECT ling.id,
gx.id,
:li_quantity ,
lingjian.quantity,
lingjian.xmid
FROM ling, gx
WHERE ( ling.lx = gx.lx ) and ( ling.xmid = :ll_xmid ) ;
...全文
185 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hedry 2005-06-11
  • 打赏
  • 举报
回复
insert into a( lj_id, gx_id, jhsl, jhxm_id )
SELECT ling.id,
gx.id,
:li_quantity ,
ling.xmid

那个:li_quantity 是不是不能这样写啊,我觉得哈!!!
不知道对不对!!!

lzheng2001 2005-06-11
  • 打赏
  • 举报
回复
应该格式3,也适用于你的情况,FAQ上有动态SQL的详细解释
动态SQL格式三

使用这种格式执行的SQL语句产生结果集,也需要输入参数,但结果集中列的数目必须固定。使用这种格式的语法如下:

DECLARE Cursor | Procedure

DYNAMIC CURSOR | PROCEDURE FOR DynamicStagingArea;

PREPARE DynamicStagingArea FROM SQLStatement

{ USING TransactionObject };

OPEN DYNAMIC Cursor { USING ParameterList };

EXECUTE DYNAMIC Procedure { USING ParameterList };

FETCH Cursor | Procedure INTO HostVaribleList ;

CLOSE Cursor | Procedure ;

其中,Cursor或Procedure 是要使用的游标或过程名;DynamicStagingArea、SQLStatement、TransactionObject和ParameterList的意义同格式二。HostVaribleList是存放查询结果的PowerBuilder变量。此方法成立的前提是:1、用于动态的SELECT语句,但SELECT语句中列的数目必须固定,WHERE、ORDER BY等子句可任意合成。2、在SQL语句中可用变量,但必须预先说明。

例如,下面语句在ls_sql中准备一个查询auths表的SELECT语句,把查询结果返回给PowerBuilder变量(用游标处理结果集):

string name,ls_sql,code

code="A%"

ls_sql="SELECT auths_name FROM auths WHERE auths_id like ?"

DECLARE c1 DYNAMIC CURSOR FOR SQLSA;

PREPARE SQLSA FROM :ls_sql;

OPEN DYNAMIC c1 USING :code;

Lable:

FETCH c1 INTO :name;

If SQLCA.SQLCode=0 then //如果成功取出记录

//进行相应处理

goto lable //取下一条

end if

CLOSE c1; //关闭游标

格式三可用于执行WHERE、ORDER BY 等子句任意组合的SELECT语句。
lzheng2001 2005-06-11
  • 打赏
  • 举报
回复
用动态SQL语句实现!
给个动态SQL语句格式1的例子
string ls_sql
ls_sql = "insert into a( lj_id, gx_id, jhsl, jhxm_id ) ~r~n"
ls_sql += "SELECT ling.id, gx.id," + string(li_quantity) + ",ling.xmid ~r~n"
ls_sql += "FROM ling, gx ~r~n"
ls_sql += "WHERE ( ling.lx = gx.lx ) and ( ling.xmid = " + string(ll_xmid) + " )"

messagebox("test",ls_sql) //这句用于测试你生成的SQL语句,这样容易发现错误
execute immediate :ls_sql

当然你还可以用动态SQL语句的2,3格式.
yamsan 2005-06-08
  • 打赏
  • 举报
回复
对不起!从程序里拷贝过来,:li_quantity是被注释了的。列数是对的。语句如下:
insert into a( lj_id, gx_id, jhsl, jhxm_id )
SELECT ling.id,
gx.id,
:li_quantity ,
ling.xmid
FROM ling, gx
WHERE ( ling.lx = gx.lx ) and ( ling.xmid = :ll_xmid ) ;

这样就执行不了。把:li_quantity换成ling.quantity就可以了。但同样的语句,我用在ASA数据库就可以。
lzheng2001 2005-06-08
  • 打赏
  • 举报
回复
列数不一致造成的!
luotitan 2005-06-08
  • 打赏
  • 举报
回复
估计是a少了一列。
dotnba 2005-06-08
  • 打赏
  • 举报
回复
除了列数不正确外,别的没错误。
这样的用法是可以的,没问题。检查一下
zxjnew 2005-06-08
  • 打赏
  • 举报
回复
不对哦 你的insert里面就四列 你有5个待插项 肯定不对哦
li_d_s 2005-06-08
  • 打赏
  • 举报
回复
用动态sql好了

1,108

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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