【问题标题】:SQL Query for Optional Custom Paging, C# ObjectDataSource可选自定义分页的 SQL 查询,C# ObjectDataSource
【发布时间】:2017-04-05 06:13:57
【问题描述】:

ObjectDataSource 的 SQL 自定义分页查询,允许每个请求只提供与特定页面相关的数据,从而提高加载速度。

问题是如何使分页成为可选?

string Query = @"
   DECLARE @PagedData int
   SET @PagedData = 1

   SELECT    
        CASE 
            WHEN @PagedData = 1 
            THEN (SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY " + _sortColumns + @") AS ResultRank, *

                FROM dbTable

                WHERE (FeatureString LIKE '%gold%')

                AS ProductsWithRowNumber WHERE ResultRank > 
                " + startIndex + " AND ResultRank <= (" + startIndex + " + " + pageSize + @"))

            ELSE (SELECT * FROM dbTable WHERE (FeatureString LIKE '%gold%'))  
        END";

目标是让 SQL 函数能够仅获取该特定页面的数据,或者它可以关闭分页获取所有相关数据。

以上是我尝试使用CASE根据变量PagedData的值来切换查询是否分页。然而,这种方法以错误告终。

如果您需要我澄清任何事情,请告诉我,谢谢。

【问题讨论】:

  • “失败”是什么意思?有什么错误信息吗?
  • 错误:“当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。”
  • 你能得到最后一句话吗,可能是一个断点,或者保存在一个文本文件中,或者一个消息框?
  • 我想你想要的是IF,而不是CASE

标签: c# sql customization objectdatasource


【解决方案1】:

您的 SQL 看起来并不完全正确,但假设它是正确的,以下是如何使用 if 语句:

 string Query = @"
DECLARE @PagedData int
SET @PagedData = 1

IF @PagedData = 1 
(
  SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY " + _sortColumns + @") AS ResultRank, *
   FROM dbTable
   WHERE (FeatureString LIKE '%gold%')
      AS ProductsWithRowNumber WHERE ResultRank > 
   " + startIndex + " AND ResultRank <= (" + startIndex + " + " + pageSize + @")
)
ELSE 
(
  SELECT * FROM dbTable WHERE (FeatureString LIKE '%gold%')
)";

https://msdn.microsoft.com/en-us/library/ms182717.aspx

【讨论】:

  • 我会检查它,如果它有效,就声明这个答案,谢谢你的洞察力\
  • 太棒了!有人告诉我如果不能在 SQL 中使用 Else 语句,哦,很沮丧.. :)
  • @Java IF ELSE 不能在查询中使用——这里我们在实际上不是 SQL 的批处理语言中使用它。从技术上讲,就像 IF/ELSE 一样,您也不能在 SQL 中拥有变量或声明语句。另请注意,使用 IF 语句可能非常慢,所以要小心。
猜你喜欢
  • 2018-09-10
  • 2013-07-28
  • 1970-01-01
  • 2015-02-02
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多