存储过程给出一个错误
本文关键字:一个 错误 存储过程 | 更新日期: 2023-09-27 18:11:59
我有一个MSSQL存储过程,如下所示:
ALTER procedure [dbo].[GetDataFromTable]
(
@rowval varchar(50),
@tablename varchar(50),
@oby varchar(50)
)
as
begin
EXEC('Select top (' + @rowval + ') * from '+@tablename+ 'ORDER BY '+@oby+' DESC')
end
在执行时,给出以下错误:Msg 156, 15层,1州,1号线关键字"BY"附近语法错误。我也尝试了以下操作,仍然是相同的错误:
ALTER procedure [dbo].[GetDataFromTable]
(
@rowval varchar(50),
@tablename varchar(50),
@oby varchar(50)
)
as
begin
EXEC('Select top (' + @rowval + ') * from '+@tablename+ 'ORDER BY sno DESC')
end
注意:@rowval表示要提取的行数,@tablename表示表名,@oby表示排序的列。注意:我正在使用ASP。在后台使用MSSQL 2008 R2 Express Edition
在 @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增加一些安全性,我将做以下更改
- 将
@rowval
设置为INT
- 在
@tablename
参数中使用QUOTENAME
函数来避免sql注入 - 将使用
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