你能在sql server预编译语句中参数化排序顺序吗?

Ele*_*hoy 3 sql-server ado.net prepared-statement

我有一个带有VB.Net前端的.Net Web系统,通过ADO.Net与SQL Server 2005后端通信.基本上,我想要做的是:

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()
Run Code Online (Sandbox Code Playgroud)

排序顺序将通过查询字符串或其他类型传递.此代码抛出"@SortOrder'附近的语法错误.无法准备语句."

这是否可能,或者我有一些非常愚蠢的语法错误,我没有看到?

(而且,是的,客户端只运行.net 2.0,所以基于LINQ的解决方案无法正常工作.

谢谢,全部!

更新/回复:

嗯,这就是我的想法.感谢所有人的理智检查.(对于某些上下文,命令字符串当前是动态构建的,但我们正在以更准备的语句方向移动系统,这是我不知道的边缘情况之一.

再次感谢!

Ste*_*ton 5

不,那不行.

有两种可能性,我可以从头脑中想到你正在尝试做的事情:

  1. 动态构建SQL字符串
  2. 从查询中返回数据表,然后使用View进行排序.

再过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 
Run Code Online (Sandbox Code Playgroud)

这也允许从给定的排序顺序中向上,向下或甚至排除该特定列.