未知列

时间:2017-11-03 09:30:18

标签: sql-server database sql-server-2012

我尝试创建一个返回通用表中行的分页的查询,因为调用此查询的调用将适用于更多的表和数据库;我工作的程序在代码的不同部分构建了查询,数据库接收的唯一变量参数是 @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之前,似乎新查询正常工作。

0 个答案:

没有答案