主题:一个PB9.0建数据窗口的疑问
zjyj
[专家分:0] 发布于 2009-11-08 22:21:00
我写我一个存储过程如下:create procedure test
(@Condition varchar(200))
as
begin
declare @Sql nvarchar(100)
create table #tmp
(nsrsbh char(18) not null,
nsrmc char(255))
set @Sql = 'insert #tmp select swdjh,nsrmc from nsrjbk where ' + @Condition
exec(@Sql)
select * from #tmp
end
GO
在PB9.0.1 7151版本中建该SQL2000数据库存储过程来源的数据窗口,就出错如图
回复列表 (共3个回复)
沙发
lovezc1314 [专家分:0] 发布于 2009-12-15 23:21:00
你先讲你的存储过程放到查询分析器中执行下看可以执行吗?如果可以再修改下参数就可以在PB的数据窗口中使用了,如果查询分析器都执行不通过那PB就更不可能通过了。
板凳
p22710194 [专家分:0] 发布于 2010-02-02 10:51:00
1、你的proc没有大的错误,但这样的写法确实不好,估计是初学。出现你说的问题,可能有2个方面的原因:
A、PB本身有Bug,这种可能性偏大些
B、创建DataWindow时,它的语法检测有问题
2、解决的办法
这里有个小技巧可以解决你说的问题,可以先用最简单的语法Create Proc,然后根据该Proc创建一DataWindow,然后再去修改你的Proc,只要返回的结果不变,创建好的数据窗口是不会再去检测Proc有没有改变的,这样就解决了你说的问题了!
3、你的Proc写法有问题,以下是你的Proc,我帮你修改一下,保持好的书写习惯对你今后的编程道路有好处
/*存储过程的名称一般以sp做前缀,然后加上DoSomething,如:spTest,这样写的好处不仅可读性好,而且有它的延展性,假如以后用到系统表,这样可以加快检索存储过程的速度
*/
create procedure test
/*
定义参数或变量时一般也带上前缀,如字符用s、整数用i等+变量,如:@sCondition、@iNumber
*/
(@Condition varchar(200))
as
begin
/*
原则上说,一般的字符串我们用varchar就可以了,不要一会用varchar,一会又用nvarchar,定义sql语法的长度已经超过你的参数长度,一旦你的参数长度超过100,肯定会出错,建议在不知道where条件的长度情况下,一般定义sql语法的长度为7000,如:declare @sql varchar(7000)
*/
declare @Sql nvarchar(100)
/*
定义临时表处理数据确实是存储过程常用的做法,但能不用时尽量不要使用,像你这个过程就没有必要使用临时表了,可以直接返回结果的,如:
set @sql = 'select swdjh,nsrmc from nsrjbk ' + @sCondition
exec (@sql)
即使使用了临时表,也要在返回数据后显式地删除临时表,虽然说会话结束,局部临时表会自动删除,但养成Create Tabel #Temp()、Drop Table #Temp的习惯比较好
*/
create table #tmp
(nsrsbh char(18) not null,
nsrmc char(255))
/*
sql的where条件这样的写法不好,应该单独把where条件定义成一变量,如:@sWhere,把条件处理好再加到原有的sql语法上,如:set @sql = @sql + @sWhere
*/
set @Sql = 'insert #tmp select swdjh,nsrmc from nsrjbk where ' + @Condition
exec(@Sql)
select * from #tmp
end
GO
3 楼
moke9 [专家分:30] 发布于 2010-09-02 12:22:00
你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846
2010年,中国网民突破了4亿,
网络游戏玩家超过了3亿,
互联网即将进入全民网游的时代
我来回复