以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  求助SQL存储过程代码?(已解决)  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=5129)

--  作者:exonjee
--  发布时间:2009/11/25 8:44:00
--  求助SQL存储过程代码?(已解决)
以下存储过程运行时,调用变量作为字段名总是报错,请教高手如何修改,谢谢

报错提示:第 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编辑过]

--  作者:狐狸爸爸
--  发布时间:2009/11/25 8:56:00
--  
我这方面完全不懂,帮顶图片点击可在新窗口打开查看
--  作者:lxl
--  发布时间: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
--  发布时间: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
--  发布时间:2009/11/25 10:05:00
--  
试下先,谢谢
--  作者:exonjee
--  发布时间:2009/11/25 10:20:00
--  

exec test 运行后报错,

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

(所影响的行数为 0 行)


--  作者:exonjee
--  发布时间: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
--  发布时间: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
--  发布时间:2009/11/25 11:12:00
--  

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

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

--  作者:lxl
--  发布时间: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                王五