存储过程出错

4

我有一个 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, Level 15, State 1, Line 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.Net和C#来执行此过程,并在后端使用MSSQL 2008 R2 Express Edition。
1个回答

6

@tablename后留出一些空格,并在ORDER之前留出空格。

Declare @sql varchar(max)=''

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

同时开始使用Print/Select来调试动态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

@ITSagar - 我们都会犯错 - Pரதீப்
谢谢,但是quotename应该放在哪里?我已经尝试过了,但是出现了错误。 - ITSagar
执行('Select top (' + @rowval + ') * from '+quotename(@tablename)+ ' ORDER BY sno DESC') 我得到的错误是:Msg 102,Level 15,State 1,Procedure GetDataFromTable,Line 8 'quotename' 附近有语法错误。 - ITSagar
我在这个存储过程创建代码中编写了三个语句 ::: CREATE PROCEDURE GetDataFromTable AS BEGIN <你的代码行在这里> END GO 但是当我从asp.net执行它时,我没有得到数据。 - ITSagar
@ITSagar - 你需要检查表中的数据。同时使用打印语句,复制打印出来的查询并手动执行以进行检查。 - Pரதீப்
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接