C# 存储过程给出了一个错误

C# 存储过程给出了一个错误,c#,asp.net,sql-server,sql-server-2008,sql-server-2008-r2,C#,Asp.net,Sql Server,Sql Server 2008,Sql Server 2008 R2,我有一个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 在执行时,它给出以下错误: 味精156,第15级,状态

我有一个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
在执行时,它给出以下错误: 味精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.Net和前端的C启动此过程,并在后端使用MSSQL 2008 R2 Express Edition

在@tablename之后和ORDER之前留出一些空间

声明@sql varcharmax= SET@sql='从中选择top'+@rowval+'*from'+quotename@tablename+“按sno DESC订购” -^这里 EXEC@sql 还可以开始使用Print/Select调试动态sql

为了给这个动态sql添加一些安全性,我将进行以下更改

将@rowval设置为INT 在@tablename参数中使用QUOTENAME函数以避免sql注入 将使用SP_EXECUTESQL而不是EXEC来执行动态查询 这里有一个正确的方法

声明@sql nvarcharmax=,@tablename varchar130,@rowval int 选择@sql='从中选择top@rowval*from'+quotename@tablename+“按sno DESC订购” exec sp_executesql@sql,N'@rowval int',@rowval=@rowval
@ITSagar-我们都会犯错误,但是quotename应该放在哪里,怎么放呢?我试过了,但从中得到了错误SEXEC'Select top'+@rowval+'*from'+quotename@tablename+“ORDER BY sno DESC”我得到的错误是:Msg 102,级别15,状态1,过程GetDataFromTable,第8行“quotename”附近的语法不正确。@ITSagar-yep将字符串直接放入exec时,我们无法使用函数。我现在更新了我的答案检查。我在SP创建代码中编写了三条语句:::创建过程GetDataFromTable AS BEGIN END GO,但从asp.net执行它时,我没有获得数据