Foxtable(狐表)用户栏目专家坐堂 → 求助SQL存储过程代码?(已解决)


  共有9474人关注过本帖树形打印复制链接

主题:求助SQL存储过程代码?(已解决)

帅哥哟,离线,有人找我吗?
exonjee
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:352 积分:3192 威望:0 精华:0 注册:2008/9/1 9:38:00
求助SQL存储过程代码?(已解决)  发帖心情 Post By:2009/11/25 8:44:00 [只看该作者]

以下存储过程运行时,调用变量作为字段名总是报错,请教高手如何修改,谢谢

报错提示:第 11 行: '@a' 附近有语法错误。


CREATE PROCEDURE Test AS
declare @gx varchar(20)
select @gx=名称 from 工序 where id=1
declare @a varchar(20)
declare @b varchar(20)
declare @c varchar(20)
set @a=@gx+'TrackIn'
set @b=@gx+'TrackOut'
set @c=@gx+'操作员'
alter table _在线 add
@a varchar(20) null
@b varchar(20) null
@c varchar(20) null
select * from _在线
Return
GO
[此贴子已经被作者于2009-11-25 11:38:42编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/11/25 8:56:00 [只看该作者]

我这方面完全不懂,帮顶图片点击可在新窗口打开查看

 回到顶部
帅哥哟,离线,有人找我吗?
lxl
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2009/11/25 9:57:00 [只看该作者]

列名 表名 为变量必须动态生成sql
CREATE PROCEDURE Test AS
declare @gx varchar(20)
select @gx=名称 from 工序 where id=1
declare @a  nvarchar(20)
declare @b  nvarchar(20)
declare @c  nvarchar(20)
declare @sql    nvarchar(max)
set @a=@gx+'TrackIn'
set @b=@gx+'TrackOut'
set @c=@gx+'操作员'
set @sql = 'alter table _在线 add '
+ @a + ' nvarchar(20) null, '
+ @b + ' nvarchar(20) null, '
+ @c + ' nvarchar(20) null  '
exec sp_executesql @sql
select * from _在线
GO


[此贴子已经被作者于2009-11-25 9:58:42编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
lxl
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2009/11/25 10:04:00 [只看该作者]

给你简化了一下
CREATE PROCEDURE Test AS
declare @gx varchar(20)
select @gx=名称 from 工序 where id=1
declare @sql    nvarchar(max)
set @sql = 'alter table _在线 add ' 
+ @gx + 'TrackIn nvarchar(20) null, '
+ @gx + 'TrackOut nvarchar(20) null, '
+ @gx + '操作员 nvarchar(20) null  '
exec sp_executesql @sql
select * from _在线
GO


你为什么要把增加列放在储存过程里面呢?列名重复就会出错。


 回到顶部
帅哥哟,离线,有人找我吗?
exonjee
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:352 积分:3192 威望:0 精华:0 注册:2008/9/1 9:38:00
  发帖心情 Post By:2009/11/25 10:05:00 [只看该作者]

试下先,谢谢

 回到顶部
帅哥哟,离线,有人找我吗?
exonjee
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:352 积分:3192 威望:0 精华:0 注册:2008/9/1 9:38:00
  发帖心情 Post By:2009/11/25 10:20:00 [只看该作者]

exec test 运行后报错,

服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: 'nvarchar' 附近有语法错误。

(所影响的行数为 0 行)


 回到顶部
帅哥哟,离线,有人找我吗?
exonjee
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:352 积分:3192 威望:0 精华:0 注册:2008/9/1 9:38:00
  发帖心情 Post By:2009/11/25 10:23:00 [只看该作者]

以下是引用lxl在2009-11-25 10:04:00的发言:

给你简化了一下
CREATE PROCEDURE Test AS
declare @gx varchar(20)
select @gx=名称 from 工序 where id=1
declare @sql    nvarchar(max)
set @sql = 'alter table _在线 add ' 
+ @gx + 'TrackIn nvarchar(20) null, '
+ @gx + 'TrackOut nvarchar(20) null, '
+ @gx + '操作员 nvarchar(20) null  '
exec sp_executesql @sql
select * from _在线
GO


你为什么要把增加列放在储存过程里面呢?列名重复就会出错。

因为想通过在foxtable中新增加工序名能在SQL相关表中自动创建新字段。有其它好的方法吗


 回到顶部
帅哥哟,离线,有人找我吗?
lxl
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2009/11/25 10:38:00 [只看该作者]

以下是引用exonjee在2009-11-25 10:20:00的发言:

exec test 运行后报错,

服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: 'nvarchar' 附近有语法错误。

(所影响的行数为 0 行)

我在sql server测试过没问题。
你用的是sql server 2000还是2005
2000 不支持sp_executesql 要改成exec

还有,你一条记录就在另外一个表增加3个字段,感觉这样的结构不合理
为什么不考虑把在线表设成工序表的字表呢?
新增工序名,_在线 表增加三条记录
————————————————————————————
说错了 2000能调用sp_executesql
要把nvarchar(max)  改成nvarchar(200) 

[此贴子已经被作者于2009-11-25 10:42:45编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
exonjee
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:352 积分:3192 威望:0 精华:0 注册:2008/9/1 9:38:00
  发帖心情 Post By:2009/11/25 11:12:00 [只看该作者]

1,我用的是SQL2000,我已将nvarchar(max)  改成nvarchar(4000)了,还是出现报错 。

[此贴子已经被作者于2009-11-25 12:19:26编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
lxl
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2009/11/25 11:38:00 [只看该作者]

1.错误应该是兼容性的问题,没用过sql 2000 所以不知道怎么改
2.数据库的结构一般都是提前设计好的,不应该在运行过程中修改表结构
所以我觉得应该这样设计:
工序表:
ID  工序名称
1     GX1
2     GX2
3     GX3


在线表
ID   工序ID      TrackIn                    TrackOut                  操作员
1        1        2009/11/10             2009/11/12                张三
2        2        2009/11/10             2009/11/12                李四
3        2        2009/11/13             2009/11/15                王五
4        3        2009/11/15             2009/11/16                王五

  


 回到顶部
总数 12 1 2 下一页