2017-02-11 11 views
0
create procedure dbo.move_pos 
(
@id int, 
@tbl varchar(50) 
)  
as  
begin  
declare @pos int  
exec('select '[email protected]+'=POS from '[email protected]+' where id='[email protected])  
exec('update '[email protected]+' set POS=POS+1 where POS<'[email protected])  
end 

В приведенном выше столбце процедуры POS имеет тип int. Но когда я м выполнения этой процедуры он показывает следующее сообщение об ошибке:Динамическое имя таблицы и параметры в SQL-хранимой процедуре

Msg 102, Level 15, State 1, Line 1

Неправильный синтаксис около '='.

Я использую SQL SERVER 2012. Нужна помощь. Заранее спасибо !!!

+0

выберите '+ @ позы +' = POS от '+ @ TBL +', где идентификатор = '+ @ идентификатор WHT и хочет сделать с @ pos –

+0

попробуйте это объявить запрос varchar (100); set query = 'select' + cast (pos as varchar) + 'from' + tbl + 'где id =' + CAST (id AS varchar) exec (query) add @before query, id, pos –

+0

@YashveerSingh I m пытается переместить элемент сверху, поэтому я использую pos. – SUPU

ответ

0

Я бы рекомендовал переосмыслить все эти динамические хранимые процедуры sql.
Однако, если вам действительно необходимо использовать динамический SQL, попробуйте вместо этого:

create procedure dbo.move_pos 
(
    @id int, 
    @tbl varchar(50) 
)  
as  
begin  
declare @sql nvarchar(max); 
set @sql = 'update ' + QUOTENAME(@tbl) + ' 
      set POS = POS + 1 
      where POS < (
       select POS 
       from ' + QUOTENAME(@tbl) + ' 
       where id = '+ cast(@id as nvarchar(10) 
      )' 

exec(@sql)  
end 
+0

Спасибо @ Zohar Он работает отлично. Большое спасибо. – SUPU