回 帖 发 新 帖 刷新版面

主题:一个PB9.0建数据窗口的疑问

我写我一个存储过程如下: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个回复)

沙发


你先讲你的存储过程放到查询分析器中执行下看可以执行吗?如果可以再修改下参数就可以在PB的数据窗口中使用了,如果查询分析器都执行不通过那PB就更不可能通过了。

板凳

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 楼

你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846
2010年,中国网民突破了4亿,
网络游戏玩家超过了3亿,
互联网即将进入全民网游的时代

我来回复

您尚未登录,请登录后再回复。点此登录或注册