Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 能否在sql server准备的语句中参数化排序顺序?_Sql Server_Ado.net_Prepared Statement - Fatal编程技术网

Sql server 能否在sql server准备的语句中参数化排序顺序?

Sql server 能否在sql server准备的语句中参数化排序顺序?,sql-server,ado.net,prepared-statement,Sql Server,Ado.net,Prepared Statement,我有一个.Net web系统,它的VB.Net前端通过ADO.Net与SQLServer2005后端通信。基本上,我想做的是: Dim command As SqlCommand = New SqlCommand("", connection) command.CommandText = "SELECT * FROM someTable ORDER BY orderValue @SortOrder" Dim sortParam As SqlParameter = New SqlParameter

我有一个.Net web系统,它的VB.Net前端通过ADO.Net与SQLServer2005后端通信。基本上,我想做的是:

Dim command As SqlCommand = New SqlCommand("", connection)
command.CommandText = "SELECT * FROM someTable ORDER BY orderValue @SortOrder"
Dim sortParam As SqlParameter = New SqlParameter("@SortOrder", SqlDbType.varChar, 3)
sortParam.Value = "ASC"
command.Parameters.Add(sortParam)
command.Prepare()
reader = command.ExecuteReader()
排序顺序将通过查询字符串或类似的方式传入。此代码在“@SortOrder”附近抛出“不正确的语法”。无法准备语句

这是可能的,还是我有一些真正愚蠢的语法错误,我没有看到

(是的,客户端只运行.NET2.0,所以基于LINQ的解决方案将无法工作,很遗憾

谢谢大家

更新/答复:

嗯,这就是我所想的。谢谢大家的理智检查。(对于某些上下文,命令字符串目前正在动态生成,但我们正在将系统移向一个更为准备好的语句方向,这是我不知道可能出现的边缘情况之一。)


再次感谢!

我认为这是不可能的,只能准备参数值。

不,您每次都需要将其构建到SQL查询中,或者如果您有排序顺序的子集,请缓存这些命令对象并作为套件重新使用

对这个问题的简短回答是“不”,不,那不行

有两种可能性,我可以马上想到做你想做的事:

  • 动态构建SQL字符串
  • 从查询返回数据表,然后使用视图进行排序

  • 再加上6年左右的经验(加上SQL Server版本),我有办法做到这一点

    DECLARE @SortByIdASC AS INT;
    SET @SortByIdASC = 1;
    WITH cte AS (
    SELECT Id, Foo, Bar
          , ROW_NUMBER() OVER (ORDER BY Id ASC) AS IdSortAsc
          , ROW_NUMBER() OVER (ORDER BY Id DESC) AS IdSortDesc 
       FROM MyTable
    )
    
    SELECT Id, Foo, Bar
       FROM cte 
       ORDER BY CASE WHEN @SortByIdASC = 1 THEN IdSortAsc
                     WHEN @SortByIdASC = 2 THEN IdSortDesc 
                     ELSE ''
                     END 
               , Foo, Bar 
    

    这还允许向上、向下排序,甚至从给定的排序顺序中排除该特定列。

    同时可以更新排序中使用的列。例如:

    declare @fname int,@lname int
    
    select @fname=1,@lname=0
    
    select * from [user]
    order by case when @Fname=1 then firstname when @lname=1 then lastname end
    

    我不认为您可以使用此技术来修改排序顺序,但您至少可以更改排序所依据的列。至少当我尝试对SQL 2005的语法提出投诉时,您可以采用与现有帖子类似的方式

    declare @firstSortField int, @secondSortField int
    set @firstSortField = 1
    set @secondSortField = 3
    
    select firstName, lastName, phoneNumber
    from customers
    order by 
        case @firstSortField when 1 then firstName when 2 then lastName when 3 then phoneNumber else null end, 
        case @secondSortField when 1 then firstName when 2 then lastName when 3 then phoneNumber else null end
    

    这完全符合您的要求,并且从不将用户输入的字符串放在数据库附近的任何位置

    //get the requested order from the query string string sortOrderRequest = request["SortOrder"].ToUpper(); string sortParam = ""; if ( sortOrderRequest.Equals("ASC")) sortParam = " order by ordervalue ASC "; else if (sortOrderRequest.Equals("DESC")) sortParam = " order by ordervalue DESC "; Dim command As SqlCommand = New SqlCommand("", connection) command.CommandText = "SELECT * FROM someTable " + sortParam; command.Prepare() reader = command.ExecuteReader() //从查询字符串中获取请求的订单 字符串sortOrderRequest=request[“SortOrder”].ToUpper(); 字符串排序图=”; if(sortOrderRequest.Equals(“ASC”)) sortParam=“按订单值ASC排序”; else if(sortOrderRequest.Equals(“DESC”)) sortParam=“按医嘱值描述医嘱”; Dim命令作为SqlCommand=新SqlCommand(“,连接) command.CommandText=“从someTable中选择*”+排序图; command.Prepare() reader=command.ExecuteReader()
    当然可以。创建两个别名列,SortASC和SortDESC,用您想要的内容填充它们,并对它们进行排序

    -- Testcase setup
    DECLARE @OrderASC bit
    SET @OrderASC = 0
    
    -- Statement required
    SELECT
        Users.*,
        CASE @OrderASC WHEN 1 THEN Users.Alias ELSE null END AS _SortASC,
        CASE @OrderASC WHEN 0 THEN Users.Alias ELSE null END AS _SortDESC
    FROM Users
    ORDER BY _SortASC, _SortDESC DESC
    

    我扩展了已接受的答案,以获得SQL查询中参数化order子句的有效解决方案。以下是示例代码:

    DECLARE @Sorting VARCHAR(200) = 'CreationTime ASC'
    
    SELECT v.*, 
    CASE WHEN @Sorting = 'CreationTime ASC' THEN ROW_NUMBER() OVER (ORDER BY v.CreationTime ASC) 
         WHEN @Sorting = 'CreationTime DESC' THEN ROW_NUMBER() OVER (ORDER BY v.CreationTime DESC) 
                                             ELSE ROW_NUMBER() OVER (ORDER BY v.Id ASC) END AS rownum
    
    FROM Vehicles v ORDER BY rownum 
    

    注意实现动态SQL字符串,SQL注入。首选是在视图中排序或使用case语句的建议之一。可能会稍微慢一点,但通常这并不重要。是的,但他希望更改排序顺序,而不是字段;-)