我有一个带有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()
排序顺序将通过查询字符串或其他类型传递.此代码抛出"@SortOrder'附近的语法错误.无法准备语句."
这是否可能,或者我有一些非常愚蠢的语法错误,我没有看到?
(而且,是的,客户端只运行.net 2.0,所以基于LINQ的解决方案无法正常工作.
谢谢,全部!
更新/回复:
嗯,这就是我的想法.感谢所有人的理智检查.(对于某些上下文,命令字符串当前是动态构建的,但我们正在以更准备的语句方向移动系统,这是我不知道的边缘情况之一.
再次感谢!
不,那不行.
有两种可能性,我可以从头脑中想到你正在尝试做的事情:
动态构建SQL字符串
从查询中返回数据表,然后使用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
这也允许从给定的排序顺序中向上,向下或甚至排除该特定列.