【发布时间】:2013-12-02 15:01:31
【问题描述】:
我有以下存储过程:
ALTER procedure [dbo].[jk_insertAllLocation]
@locationTbl as locationTable readonly,
@TableName varchar(100)
as
declare @tbl as locationTable, @sql nvarchar(max)
begin
set @sql = N'insert into '+ @tbl + 'select * from ' + @locationTbl +
'delete c
from @tbl c
inner join'+ @TableName + 'ON '+@TableName+ '.location_id=c.location_id'
exec sp_executesql @sql
set @sql= N'insert into'+ @TableName+ '(location_id,name,address,latitude,longitude,distance,state,sub_cat,id_cat,icon_link,checkinsCount,IDSearch)
select * from '+ @tbl
exec sp_executesql @sql
select id,location_id from lebanon
end
我不断得到:
必须声明标量变量“@tbl”。
必须声明标量变量“@locationTbl”。
它们已经被声明了..
我认为问题在于它们不是要连接的字符串的表,但我必须将表名作为参数 @TableName 传递,并且我在使用 inner join 和 insert 的 2 个单独查询中使用此表名那我该怎么做呢?我在谷歌上找不到任何东西
我错过了什么吗?
【问题讨论】:
-
尝试将
declare语句放在begin/end块内 -
@Andomar nop 它不起作用 :) 我总是将声明放在开始/结束块之外,它工作正常......我不认为这是问题
-
我还没有完全清醒,但我很确定你在尝试将
locationTable(@tbl) 连接到nvarchar(max)变量 (@ 987654330@). -
@LittleBobbyTables 是的,我认为这是问题所在,但我必须将表名作为参数
@TableName传递,并且我在使用inner join和insert的 2 个单独的查询中使用此表名,所以我怎样才能做到这一点?我在谷歌上找不到任何东西 -
@tbl 为空,因此您的整个连接语句为空。但是,我不想将表名发送到这样的 proc,如果您觉得有必要这样做,那肯定是糟糕的数据库设计的迹象。
标签: sql sql-server-2008 execute sqlparameter