另一种选择是使用a
recursive CTE获取预定的行数,然后使用
nestedCTE构造将来自递归CTE的行与原始表合并,最后使用
TOP子句获取所需的行数。
DECLARE @n INT = 10;WITH Nulls AS ( SELECt 1 AS i UNIOn ALL SELECT i + 1 AS i FROM Nulls WHERe i < @n),itemsWithNulls AS( SELECt * FROM itens UNIOn ALL SELECt NULL, NULL, NULL, NULL FROM Nulls )SELECt TOP (@n) *FROM itemsWithNulls
编辑:
通过更仔细地阅读需求,OP实际上希望返回的总行数 是10的倍数
。例如,如果表
itens有4行,则应返回10行,如果表
itens有12行,则应返回20行,依此类推。
在这种情况下,
@n应设置为:
DECLARE @n INT = ((SELECt COUNT(*) FROM itens) / 10 + 1) * 10
实际上,我们可以使用嵌套的CTE将所有内容放入 单个sql语句中 :
;WITH NumberOfRows AS ( SELECt n = ((SELECT COUNT(*) FROM itens) / 10 + 1) * 10), Nulls AS ( SELECt 1 AS i UNIOn ALL SELECT i + 1 AS i FROM Nulls WHERe i < (SELECt n FROM NumberOfRows)),itemsWithNulls AS( SELECt * FROM itens UNIOn ALL SELECt NULL, NULL, NULL, NULL FROM Nulls )SELECt TOP (SELECT n FROM NumberOfRows) *FROM itemsWithNulls
sqlfiddle



