2016-10-07 1 views
4

У меня есть хранимую процедуру MSSQL, как показано ниже:хранимая процедура выдает ошибку

ALTER procedure [dbo].[GetDataFromTable] 
(
@rowval varchar(50), 
@tablename varchar(50), 
@oby varchar(50) 
) 
as 
begin 
EXEC('Select top (' + @rowval + ') * from '[email protected]+ 'ORDER BY '[email protected]+' DESC') 
end 

Об исполнении, он дает следующее сообщение об ошибке: Msg 156, уровень 15, состояние 1, строка 1 Неправильный синтаксис около ключевого слова 'ОТ'. Я попробовал также следующие, все та же ошибка:

ALTER procedure [dbo].[GetDataFromTable] 
(
@rowval varchar(50), 
@tablename varchar(50), 
@oby varchar(50) 
) 
as 
begin 
EXEC('Select top (' + @rowval + ') * from '[email protected]+ 'ORDER BY sno DESC') 
end 

Примечание: @rowval представляет количество строк, чтобы быть неправдоподобным, @tablename представляет имя таблицы, @oby представляет собой колонну, на основании которых упорядочение должно быть сделано. Примечание: Я использую ASP.Net с C# на интерфейсе стрелять эту процедуру и с использованием MSSQL 2008 R2 Express Edition на внутреннем интерфейсе

ответ

6

Дайте некоторое пространство после@tablename и перед темORDER

Declare @sql varchar(max)='' 

SET @sql = 'Select top (' + @rowval + ') * from '+quotename(@tablename)+ ' ORDER BY sno DESC' 
                     --^here 
EXEC (@sql) 

Также начните использовать Print/Select для отладки dynamic sql

Чтобы добавить некоторую защиту в этот динамический sql, сделаю следующие изменения:

  1. Сделать @rowval в INT
  2. Использование QUOTENAME функция @tablename параметра, чтобы избежать SQL Injection
  3. будет использовать SP_EXECUTESQL для выполнения динамического запроса вместо EXEC

Вот это правильный путь сделать это

Declare @sql nvarchar(max)='',@tablename varchar(130), @rowval int 

select @sql = 'Select top (@rowval) * from '+quotename(@tablename)+ ' ORDER BY sno DESC' 

exec sp_executesql @sql,N'@rowval int',@rowval = @rowval 
+0

OOPS, так глупо от меня. Большое спасибо. – ITSagar

+0

@ITSagar - Мы все ошибаемся –

+0

Спасибо, а где поставить квотирование и как? Я попытался, но получил ошибки – ITSagar