【问题标题】:Stored Procedure gives an error存储过程报错
【发布时间】:2017-02-16 14:55:23
【问题描述】:

我有一个 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 表示应根据哪个列进行排序。 注意:我在前端使用带有 C# 的 ASP.Net 来触发此过程,并在后端使用 MSSQL 2008 R2 Express Edition

【问题讨论】:

    标签: c# asp.net sql-server sql-server-2008 sql-server-2008-r2


    【解决方案1】:

    给一些空间 after @tablenamebefore 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
    

    【讨论】:

    • @ITSagar - 我们都会犯错误
    • 谢谢,但是在哪里放 quotename 以及如何?我试过了,但是出错了
    • EXEC('Select top (' + @rowval + ') * from '+quotename(@tablename)+ ' ORDER BY sno DESC') 我得到的错误是:消息 102,级别 15,状态1,过程GetDataFromTable,第8行'quotename'附近的语法不正确。
    • @ITSagar - 是的,当将字符串直接放入exec 时,我们不能使用function,现在更新了我的答案检查。
    • 我在这个 SP 创建代码中写了三个语句 ::: CREATE PROCEDURE GetDataFromTable AS BEGIN END GO 但是我从 asp.net 执行它时没有得到数据
    猜你喜欢
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2013-06-10
    • 2011-04-18
    • 2012-04-21
    • 2012-07-17
    • 1970-01-01
    • 2014-07-18
    相关资源
    最近更新 更多