存储过程给出一个错误

本文关键字:一个 错误 存储过程 | 更新日期: 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增加一些安全性,我将做以下更改

  1. @rowval设置为INT
  2. @tablename参数中使用QUOTENAME函数来避免sql注入
  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
相关文章: