日期:2014-05-18  浏览次数:20407 次

存储过程 必须声明变量的问题
(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

大家多多指教   我第一次编存储过程

------解决方案--------------------
(1)
create procedure dl @a varchar(6) as

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

……

------解决方案--------------------
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
*/
------解决方案--------------------
create procedure dl @a varchar(6) as

select * from b where b=@a

GO

exec dl 'a '

drop proc dl

/*


命令已成功完成。


*/
------解决方案--------------------
(1)
create procedure dl @a varchar(6) as

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


这条似乎没有问题

------解决方案--------------------
go都要去
------解决方案--------------------

你的问题出在这里
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