请问一个存储过程的问题。怎么把传入参数作为Sql语句所查表的表名。

lihongxing2002 2003-08-10 09:51:13
我有以下存储过程:总是提示:
必须声明变量 '@name'。
第 7 行: ')' 附近有语法错误。

CREATE PROCEDURE ImportBaseDataQT
@name varchar(100)
AS
DECLARE @ErrorVar int
BEGIN TRANSACTION

insert into VSites (地点) select distinct 地点 from @name where (地点 not in (select * from VSites))
insert into VLocations (地点,位置) select 地点,位置 from @name where (地点 not in (select * from VSites))

SELECT @ErrorVar = @@error
IF (@ErrorVar <>0)
BEGIN
ROLLBACK TRANSACTION
RETURN 1
END
ELSE
COMMIT TRANSACTION
RETURN 0
GO

但是当我不用传入参数@name,而是换成表名的时候,就没有语法错误。请问该怎么解决?因为我要的表名是个临时表,表的名字是会变得。
...全文
148 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengdali 2003-08-10
  • 打赏
  • 举报
回复
CREATE PROCEDURE ImportBaseDataQT
@name varchar(100)
AS
DECLARE @ErrorVar int
BEGIN TRANSACTION

exec('insert into VSites (地点) select distinct 地点 from '+@name+' where (地点 not in (select * from VSites))')
SELECT @ErrorVar = @@error
exec('insert into VLocations (地点,位置) select 地点,位置 from '+@name+' where (地点 not in (select * from VSites))')
IF (@ErrorVar <>0 or @@error<>0)
BEGIN
ROLLBACK TRANSACTION
RETURN 1
END
ELSE
COMMIT TRANSACTION
RETURN 0
GO
pengdali 2003-08-10
  • 打赏
  • 举报
回复
CREATE PROCEDURE ImportBaseDataQT
@name varchar(100)
AS
DECLARE @ErrorVar int
BEGIN TRANSACTION

exec('insert into VSites (地点) select distinct 地点 from '+@name+' where (地点 not in (select * from VSites))
insert into VLocations (地点,位置) select 地点,位置 from '+@name+' where (地点 not in (select * from VSites))')

SELECT @ErrorVar = @@error
IF (@ErrorVar <>0)
BEGIN
ROLLBACK TRANSACTION
RETURN 1
END
ELSE
COMMIT TRANSACTION
RETURN 0
GO
zjcxc 2003-08-10
  • 打赏
  • 举报
回复
上面的写少了一个括号,改一下:

CREATE PROCEDURE ImportBaseDataQT
@name varchar(100)
AS
DECLARE @ErrorVar int
BEGIN TRANSACTION

exec('insert into VSites (地点) select distinct 地点 from '+@name+' where (地点 not in (select * from VSites))') --将你原来这句改为用exec执行就行了

SELECT @ErrorVar = @@error
IF (@ErrorVar <>0)
BEGIN
ROLLBACK TRANSACTION
RETURN 1
END
ELSE
COMMIT TRANSACTION
RETURN 0
GO

zjcxc 2003-08-10
  • 打赏
  • 举报
回复
表名不能直接使用变量,改成下面的这样就可以了:


CREATE PROCEDURE ImportBaseDataQT
@name varchar(100)
AS
DECLARE @ErrorVar int
BEGIN TRANSACTION

exec('insert into VSites (地点) select distinct 地点 from '+@name+' where (地点 not in (select * from VSites))'

SELECT @ErrorVar = @@error
IF (@ErrorVar <>0)
BEGIN
ROLLBACK TRANSACTION
RETURN 1
END
ELSE
COMMIT TRANSACTION
RETURN 0
GO
gaobochina 2003-08-10
  • 打赏
  • 举报
回复

对不起
最后一句忘加括号了
exec (@str)
gaobochina 2003-08-10
  • 打赏
  • 举报
回复
declare @str varchar(4000)
declare @tablename varchar(20)
set @tablename='表名'
set @str='select * from '+@tablename
select @str
exec @str
lihongxing2002 2003-08-10
  • 打赏
  • 举报
回复
上面存储过程我多写了一句,更正如下:
CREATE PROCEDURE ImportBaseDataQT
@name varchar(100)
AS
DECLARE @ErrorVar int
BEGIN TRANSACTION

insert into VSites (地点) select distinct 地点 from @name where (地点 not in (select * from VSites))

SELECT @ErrorVar = @@error
IF (@ErrorVar <>0)
BEGIN
ROLLBACK TRANSACTION
RETURN 1
END
ELSE
COMMIT TRANSACTION
RETURN 0
GO

22,209

社区成员

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

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