存储过程报错,请教大虾指点!急急急!

SIRIUS_ORA 2008-10-22 08:10:37

--if exists (select name from sysobjects where name ='p_lee_update_prodect' and type ='P')
-- DROP proc p_lee_update_prodect
--go

create proc p_lee_update_prodect
as
begin
if exists (select name from sysobjects where name ='v_prodect_info' and type ='V')
DROP VIEW v_prodect_info

create VIEW v_prodect_info
as
select * from sbd_prodect_info

declare
@ll_row int
select @ll_row = count(distinct(a.code_id)) from sbd_prodect_original a,sbd_prodect_info b where a.code_id <> b.code_id
if @ll_row > = 1
SELECT distinct information.code_id,
information.code_name,
'三边封',
information.spec_longth,
information.spec_width,
10000,
'A',
information.publish_longth,
information.publish_per,
case when information.made_order ='横' then 1
else 2 end,
case when information.made_layer ='单' then 1
when information.made_layer ='双' then 2
when information.made_layer ='三' then 3
when information.made_layer ='四' then 4
else 5 end,
case when information.made_type ='是' then 'yes'
else 'no' end,
information.color_count,
information.ink_type,
information.color_note
into sbd_prodect_info
FROM sbd_prodect_original join v_prodect_info as information
on sbd_prodect_original.code_id <> v_prodect_info.code_id
end

提示错误:服务器: 消息 156,级别 15,状态 1,过程 p_lee_update_prodect,行 11
在关键字 'VIEW' 附近有语法错误。
...全文
147 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
SIRIUS_ORA 2008-10-23
  • 打赏
  • 举报
回复
问题已解决,谢谢楼上各位大虾了,尤其是Garnett_KG,谢谢!
结贴去了,嘿嘿
SIRIUS_ORA 2008-10-22
  • 打赏
  • 举报
回复
晕菜ing!
水族杰纶 2008-10-22
  • 打赏
  • 举报
回复
动态sql语句基本语法 
1 :普通SQL语句可以用Exec执行

eg: Select * from tableName
Exec('select * from tableName')
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL

eg:
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
Exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格

当然将字符串改成变量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --设置字段名

declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句会报错



declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正确

3. 输出参数
declare @num int,
@sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)
--如何将exec执行结果放入变量中?

declare @num int,
@sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num
Garnett_KG 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 SIRIUS_ORA 的回复:]
服务器: 消息 207,级别 16,状态 3,过程 p_lee_update_prodect,行 16
列名 'code_name' 无效。
服务器: 消息 207,级别 16,状态 1,过程 p_lee_update_prodect,行 16
列名 'made_order' 无效。
服务器: 消息 207,级别 16,状态 1,过程 p_lee_update_prodect,行 16
列名 'made_layer' 无效。
服务器: 消息 207,级别 16,状态 1,过程 p_lee_update_prodect,行 16
列名 'made_layer' 无效。
服务器: 消息…
[/Quote]

头大,你先不要在存储过程中创建view,就用基表(sbd_prodect_info),试下会不会有问题。
Garnett_KG 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 SIRIUS_ORA 的回复:]
还是不行,请继续指教,再次感谢各位大虾!
[/Quote]


报什么错啊?
SIRIUS_ORA 2008-10-22
  • 打赏
  • 举报
回复
服务器: 消息 207,级别 16,状态 3,过程 p_lee_update_prodect,行 16
列名 'code_name' 无效。
服务器: 消息 207,级别 16,状态 1,过程 p_lee_update_prodect,行 16
列名 'made_order' 无效。
服务器: 消息 207,级别 16,状态 1,过程 p_lee_update_prodect,行 16
列名 'made_layer' 无效。
服务器: 消息 207,级别 16,状态 1,过程 p_lee_update_prodect,行 16
列名 'made_layer' 无效。
服务器: 消息 207,级别 16,状态 1,过程 p_lee_update_prodect,行 16
列名 'made_layer' 无效。
服务器: 消息 207,级别 16,状态 1,过程 p_lee_update_prodect,行 16
列名 'made_layer' 无效。
服务器: 消息 207,级别 16,状态 1,过程 p_lee_update_prodect,行 16
列名 'made_type' 无效。
服务器: 消息 207,级别 16,状态 1,过程 p_lee_update_prodect,行 16
列名 'color_note' 无效。
服务器: 消息 8155,级别 16,状态 1,过程 p_lee_update_prodect,行 16
没有为第 3 列(属于 'sbd_prodect_info')指定列。
服务器: 消息 8155,级别 16,状态 1,过程 p_lee_update_prodect,行 16
没有为第 6 列(属于 'sbd_prodect_info')指定列。
服务器: 消息 8155,级别 16,状态 1,过程 p_lee_update_prodect,行 16
没有为第 7 列(属于 'sbd_prodect_info')指定列。
服务器: 消息 8155,级别 16,状态 1,过程 p_lee_update_prodect,行 16
没有为第 10 列(属于 'sbd_prodect_info')指定列。
服务器: 消息 8155,级别 16,状态 1,过程 p_lee_update_prodect,行 16
没有为第 11 列(属于 'sbd_prodect_info')指定列。
服务器: 消息 8155,级别 16,状态 1,过程 p_lee_update_prodect,行 16
没有为第 12 列(属于 'sbd_prodect_info')指定列。
SIRIUS_ORA 2008-10-22
  • 打赏
  • 举报
回复
还是不行,请继续指教,再次感谢各位大虾!
fcuandy 2008-10-22
  • 打赏
  • 举报
回复
try:



create proc p_lee_update_prodect
as
begin
if exists (select name from sysobjects where name ='v_prodect_info' and type ='V')
exec('DROP VIEW v_prodect_info')

exec('create VIEW v_prodect_info
as
select * from sbd_prodect_info')

declare
@ll_row int
select @ll_row = count(distinct(a.code_id)) from sbd_prodect_original a,sbd_prodect_info b where a.code_id <> b.code_id
if @ll_row > = 1
SELECT distinct information.code_id,
information.code_name,
'三边封',
information.spec_longth,
information.spec_width,
10000,
'A',
information.publish_longth,
information.publish_per,
case when information.made_order ='横' then 1 else 2 end,
case
when information.made_layer ='单' then 1
when information.made_layer ='双' then 2
when information.made_layer ='三' then 3
when information.made_layer ='四' then 4
else 5
end,
case when information.made_type ='是' then 'yes' else 'no' end,
information.color_count,
information.ink_type,
information.color_note
into sbd_prodect_info
FROM sbd_prodect_original
join v_prodect_info as information --这里用了别名
on sbd_prodect_original.code_id <> information.code_id --因为上面用了别名,所以被别名接管了,表名找不到
end
Garnett_KG 2008-10-22
  • 打赏
  • 举报
回复
create proc p_lee_update_prodect
as
begin
if exists (select name from sysobjects where name ='v_prodect_info' and type ='V')
DROP VIEW v_prodect_info
EXEC('
create VIEW v_prodect_info
as
select * from sbd_prodect_info
')
declare
@ll_row int
select @ll_row = count(distinct(a.code_id)) from sbd_prodect_original a,sbd_prodect_info b where a.code_id <> b.code_id
if @ll_row > = 1
SELECT distinct information.code_id,
information.code_name,
'三边封',
information.spec_longth,
information.spec_width,
10000,
'A',
information.publish_longth,
information.publish_per,
case when information.made_order ='横' then 1
else 2 end,
case when information.made_layer ='单' then 1
when information.made_layer ='双' then 2
when information.made_layer ='三' then 3
when information.made_layer ='四' then 4
else 5 end,
case when information.made_type ='是' then 'yes'
else 'no' end,
information.color_count,
information.ink_type,
information.color_note
into sbd_prodect_info
FROM sbd_prodect_original join v_prodect_info as information
on sbd_prodect_original.code_id <> information.code_id
end

SIRIUS_ORA 2008-10-22
  • 打赏
  • 举报
回复
楼上二位在帮忙看看,还是有问题啊
提示错误:服务器: 消息 107,级别 16,状态 3,过程 p_lee_update_prodect,行 19
列前缀 'v_prodect_info' 与查询中所用的表名或别名不匹配。
中国风 2008-10-22
  • 打赏
  • 举报
回复
只可改为动态只能用动态

create view前面只有是注释和go
fcuandy 2008-10-22
  • 打赏
  • 举报
回复
create 对象 必须是批中的首条语句,所以你的写法不能成功。

你kg那样改为动态语句。
Garnett_KG 2008-10-22
  • 打赏
  • 举报
回复



create proc p_lee_update_prodect
as
begin
if exists (select name from sysobjects where name ='v_prodect_info' and type ='V')
DROP VIEW v_prodect_info
EXEC('
create VIEW v_prodect_info
as
select * from sbd_prodect_info
')
declare
@ll_row int
select @ll_row = count(distinct(a.code_id)) from sbd_prodect_original a,sbd_prodect_info b where a.code_id <> b.code_id
if @ll_row > = 1
SELECT distinct information.code_id,
information.code_name,
'三边封',
information.spec_longth,
information.spec_width,
10000,
'A',
information.publish_longth,
information.publish_per,
case when information.made_order ='横' then 1
else 2 end,
case when information.made_layer ='单' then 1
when information.made_layer ='双' then 2
when information.made_layer ='三' then 3
when information.made_layer ='四' then 4
else 5 end,
case when information.made_type ='是' then 'yes'
else 'no' end,
information.color_count,
information.ink_type,
information.color_note
into sbd_prodect_info
FROM sbd_prodect_original join v_prodect_info as information
on sbd_prodect_original.code_id <> v_prodect_info.code_id
end




SIRIUS_ORA 2008-10-22
  • 打赏
  • 举报
回复
自己来顶下!

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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