我尝试创建一个返回通用表中行的分页的查询,因为调用此查询的调用将适用于更多的表和数据库;我工作的程序在代码的不同部分构建了查询,数据库接收的唯一变量参数是 @myTable , @offset 和 @row
最初,我尝试了一个像这样的单个表的查询
SELECT * FROM myTable ORDER BY myPKColumn
OFFSET @offset ROWS
FETCH NEXT @row ROWS ONLY;
并且,@ offset = 0且@row = 10,返回前10行ASC。
到目前为止它一切都没有问题,但如果我需要对每个表使用此查询,我在ORDER BY子句中指定列时遇到问题;为了避免这个问题,我尝试过这个问题
SELECT * FROM @myTable ORDER BY (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME=@myTable and CONSTRAINT_NAME like 'PK_%')
OFFSET @offset ROWS
FETCH NEXT @row ROWS ONLY;
这是因为我从项目结构中知道我可以调用的所有表都有一个主键。
查询有效,但结果有点奇怪:如果我传递先前查询的相同参数,结果是11到2 DESC的行。
另外,改变偏移值,我想到了这个奇怪的关系:
如果[@offset< =(100 - @row)] >
结果是没有第一行的第一个(@ row + 1)DESC
(在这种情况下,永远不会检索@row和@offset之间的所有行)
否则 >
结果是从(@offset + 1)
开始的第一个@row示例:
@offset = 90 and @row = 10 return rows from 13 to 2 @offset = 91 and @row = 10 return rows from 92 to 101 @offset = 101 and @row = 10 return rows from 102 to 111
我尝试了一些小变化,例如在第二个选择之外指定OBJECT_ID(...)或OBJECT_NAME(OBJECT_ID(...)),但没有更改;此外,我已尝试使用调试选项,但我没有使用它的权限。
有什么可能导致这种奇怪结果的想法吗?
P.S:抱歉我的英语不好;这也是我的第一篇文章,如果我错过了一些我没有问题的编辑编辑:
我找到了一种逻辑上可行的方法,但它不起作用:
我发现写了一个像
这样的查询SELECT * FROM myTable ORDER BY 5 asc;
考虑第5列的值,命令我的行为ascendent。
所以我提出了查询:
select ORDINAL_POSITION from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'myTable' and COLUMN_NAME = (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME='myTable' and CONSTRAINT_NAME like 'PK_%')
用主键返回列的位置(对我来说不幸的是,有很多表不在第一个位置);返回的值是正确的(我已经验证了很多表并且它始终有效)
所以,下一步,如果我运行查询
select * from mytable ORDER BY (select ORDINAL_POSITION from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'myTable' and COLUMN_NAME = (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME='myTable' and CONSTRAINT_NAME like 'PK_%' )) asc;
有一个小问题:我可以声明asc或desc,但结果总是asc。 (这不是一个真正的问题,因为在我的情况下,顺序说顺序并不重要)。
现在真正的问题。
最后一步是查询
select * from mytable ORDER BY (select ORDINAL_POSITION from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'myTable' and COLUMN_NAME = (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME='myTable' and CONSTRAINT_NAME like 'PK_%' )) asc
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY;
这里没有改变编辑前的问题:结果是11到2之间的行。
为了避免错误可能是返回的数字的字符串解释,我已经向int添加了一个强制转换
SELECT * FROM myTable
ORDER BY CAST((select ORDINAL_POSITION from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'myTable' and COLUMN_NAME = (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME='myTable' and CONSTRAINT_NAME like 'PK_%' ))AS int) asc
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY;
但没有改变。
在添加offset / fetch之前,似乎新查询正常工作。