存储过程 必须声明变量的问题

krack2002 2007-06-01 10:58:57
(1)
create procedure dl @a varchar(6) as

insert into tb (……) select (……) from tb1 where f1=@a
GO

……
提示:必须声明变量@a

(2)
修改为:
create procedure dl @a varchar(6) as

declare @sql varchar(1000)
set @sql='insert into tb (……) select (……) from tb1 where f1='+@a
exec(@sql)
GO

……
还是提示:必须声明变量@a

大家多多指教 我第一次编存储过程
...全文
1622 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
hb_gx 2007-06-01
  • 打赏
  • 举报
回复

你的问题出在这里
if exists (select * from dbo.sysobjects where id=object_id(N'tb') and OBJECTPROPERTY(id,N'IsUserTable')=1)
drop table tb
GO

应该这里有GO
所以编译器认为你的存储过程玩了
接着执行下面的语句当然就出错了

改一下:
CREATE PROCEDURE dl @a varchar(6) AS

if exists (select * from dbo.sysobjects where id=object_id(N'tb') and OBJECTPROPERTY(id,N'IsUserTable')=1)
drop table tb

CREATE TABLE tb (
……
) ON [PRIMARY]

declare @sql varchar(1000)
set @sql='INSERT INTO tb (……) SELECT …… FROM tb1 WHERE f1='''+@a+''''
exec(@sql)
GO

wgzaaa 2007-06-01
  • 打赏
  • 举报
回复
go分隔批,而变量只在同一批中有效
wgzaaa 2007-06-01
  • 打赏
  • 举报
回复
go都要去
krack2002 2007-06-01
  • 打赏
  • 举报
回复
to ljsql(沙漠,扬起你的沙砾,遮蔽太阳的光芒吧) :我是在企业管理器中 按钮检查语法 报的错
krack2002 2007-06-01
  • 打赏
  • 举报
回复
to happyflystone(无枪的狙击手) :按照2楼的方法试了,还出相同的错
krack2002 2007-06-01
  • 打赏
  • 举报
回复
我把全部贴出,大家帮我看看
CREATE PROCEDURE dl @a varchar(6) AS

if exists (select * from dbo.sysobjects where id=object_id(N'tb') and OBJECTPROPERTY(id,N'IsUserTable')=1)
drop table tb
GO

CREATE TABLE tb (
……
) ON [PRIMARY]
GO

declare @sql varchar(1000)
set @sql='INSERT INTO tb (……) SELECT …… FROM tb1 WHERE f1='''+@a+''''
exec(@sql)
GO
云中客 2007-06-01
  • 打赏
  • 举报
回复
2)
Create procedure dl @a varchar(6) as

declare @sql varchar(1000)
set @sql='insert into tb (……) select (……) from tb1 where f1='+@a
exec(@sql)
GO
----------------------------------------------------------------------
修改这条:
set @sql='insert into tb (……) select (……) from tb1 where f1='''+@a +''''

原因:由于是字符型,所以要增加引号
paoluo 2007-06-01
  • 打赏
  • 举报
回复
krack2002(痴) ( ) 信誉:100 Blog 加为好友 2007-06-01 11:08:17 得分: 0


我试了一下 还是出那个错


---------
你測試這段完整的代碼看看。

Create Table tb(f1 varchar(6), f2 varchar(6))
Create Table tb1(f1 varchar(6), f2 varchar(6))
Insert tb1 Select 'a', 'b'
GO
--(1)
create procedure dl @a varchar(6) as
insert into tb (f1, f2) select f1, f2 from tb1 where f1=@a
GO
EXEC dl 'a'

Select * From tb
GO
Delete From tb
Drop procedure dl
GO

--(2)
create procedure dl @a varchar(6) as

declare @sql varchar(1000)
set @sql='insert into tb (f1, f2) select f1, f2 from tb1 where f1='''+@a + ''''
exec(@sql)
GO
EXEC dl 'a'

Select * From tb
GO
Drop Table tb, tb1
Drop procedure dl
--Result
/*
f1 f2
a b
*/
云中客 2007-06-01
  • 打赏
  • 举报
回复
(1)
create procedure dl @a varchar(6) as

insert into tb (……) select (……) from tb1 where f1=@a


这条似乎没有问题
krack2002 2007-06-01
  • 打赏
  • 举报
回复
不好意思 ,其实在这个插入语句之前 是建了一个表 紧接着往表里写数据
肥胖的柠檬 2007-06-01
  • 打赏
  • 举报
回复
LZ是什么运行的???

你是不是:

(1)
create procedure dl @a varchar(6) as
/******
insert into tb (……) select (……) from tb1 where f1=@a
GO
是不是测试时,只运行了这个??
……*********/
提示:必须声明变量@a

(2)
修改为:
create procedure dl @a varchar(6) as
/******
declare @sql varchar(1000)
set @sql='insert into tb (……) select (……) from tb1 where f1='+@a
exec(@sql)
GO
是不是测试时,只运行了这个??
……*********/
krack2002 2007-06-01
  • 打赏
  • 举报
回复
我试了一下 还是出那个错
肥胖的柠檬 2007-06-01
  • 打赏
  • 举报
回复
create procedure dl @a varchar(6) as

select * from b where b=@a

GO

exec dl 'a'

drop proc dl

/*


命令已成功完成。


*/
paoluo 2007-06-01
  • 打赏
  • 举报
回复
Create Table tb(f1 varchar(6), f2 varchar(6))
Create Table tb1(f1 varchar(6), f2 varchar(6))
Insert tb1 Select 'a', 'b'
GO
--(2)
create procedure dl @a varchar(6) as

declare @sql varchar(1000)
set @sql='insert into tb (f1, f2) select f1, f2 from tb1 where f1='''+@a + ''''
exec(@sql)
GO
EXEC dl 'a'

Select * From tb
--Result
/*
f1 f2
a b
*/
paoluo 2007-06-01
  • 打赏
  • 举报
回复
第一個應該沒有問題。
paoluo 2007-06-01
  • 打赏
  • 举报
回复
Create Table tb(f1 varchar(6), f2 varchar(6))
Create Table tb1(f1 varchar(6), f2 varchar(6))
Insert tb1 Select 'a', 'b'
GO
--(1)
create procedure dl @a varchar(6) as
insert into tb (f1, f2) select f1, f2 from tb1 where f1=@a
GO
EXEC dl 'a'

Select * From tb
--Result
/*
f1 f2
a b
*/
-狙击手- 2007-06-01
  • 打赏
  • 举报
回复
create procedure dl @a varchar(6) as

declare @sql varchar(1000)
set @sql='insert into tb (……) select (……) from tb1 where f1='''+@a+''''
exec(@sql)
GO


drop proc dl

/*


命令已成功完成。


*/

-狙击手- 2007-06-01
  • 打赏
  • 举报
回复
(1)
create procedure dl @a varchar(6) as

exec('insert into tb (……) select (……) from tb1 where f1= '''+@a+'''')
GO

……
krack2002 2007-06-01
  • 打赏
  • 举报
回复
好了 结贴 谢谢 各路好汉!

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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