Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Sql Server中始终返回指定数量的记录_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

在Sql Server中始终返回指定数量的记录

在Sql Server中始终返回指定数量的记录,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个查询,我总是想返回10条记录: set rowcount 10 select row_number() over(order by count(*) desc) row_num ,hist_report_id ,max(rpt_report_name) report_name from utility.dbo.tbl_report_history join utility.dbo.tbl_report_definitions on hist_report_id =

我有一个查询,我总是想返回10条记录:

set rowcount 10
select row_number() over(order by count(*) desc) row_num
    ,hist_report_id
    ,max(rpt_report_name) report_name
from utility.dbo.tbl_report_history
join utility.dbo.tbl_report_definitions
    on hist_report_id = rpt_report_id
where hist_user_id = 1038
group by hist_report_id
如果我有10张或更多的记录,这就行了。问题是当记录少于10条时,我仍然需要在report_id和report_name字段中返回带有null的rownumber字段

如果仅返回7条记录,则结果应如下所示:

row_num report_id report_name
1       id1       name1
2       id2       name2
3       id3       name3
4       id4       name4
5       id5       name5
6       id6       name6
7       id7       name7
8       null      null
9       null      null
10      null      null
有什么建议吗


我正在使用SQL Server 2008,这是我记忆中最简单的方法:

将select结果插入一个诱人的 当count*<10时,将行插入到
我记得最简单的方法是:

将select结果插入一个诱人的 当count*<10时,将行插入到 计数不能返回小于零的值。。。因此,只需通过union在count列中附加10个带-1的伪行

另外,不要使用SET ROWCOUNT,因为它会影响中间结果

SELECT TOP 10
   row_number() over(order by TheCount desc) AS row_num,
   hist_report_id,
   report_name
FROM
    (
    select 
        ,count(*) AS TheCount
        ,hist_report_id
        ,max(rpt_report_name) AS report_name
    from 
       utility.dbo.tbl_report_history
       join 
       utility.dbo.tbl_report_definitions on hist_report_id = rpt_report_id
    where hist_user_id = 1038
    group by hist_report_id
    UNION ALL
    SELECT TOP 10
         -1, NULL, NULL
    FROM sys.columns
    ) T
计数不能返回小于零的值。。。因此,只需通过union在count列中附加10个带-1的伪行

另外,不要使用SET ROWCOUNT,因为它会影响中间结果

SELECT TOP 10
   row_number() over(order by TheCount desc) AS row_num,
   hist_report_id,
   report_name
FROM
    (
    select 
        ,count(*) AS TheCount
        ,hist_report_id
        ,max(rpt_report_name) AS report_name
    from 
       utility.dbo.tbl_report_history
       join 
       utility.dbo.tbl_report_definitions on hist_report_id = rpt_report_id
    where hist_user_id = 1038
    group by hist_report_id
    UNION ALL
    SELECT TOP 10
         -1, NULL, NULL
    FROM sys.columns
    ) T

<>你可以考虑使用一个TVF来返回一组你可以与之连接的数字:

CREATE FUNCTION SetOfValues (@beginningAt int, @endingAt int, @step int = 1)
RETURNS 
    @result TABLE (value int )
AS BEGIN
    declare @counter int set @counter = @beginningAt
    while(@counter<=@endingAt)
    begin
        insert into @result values(@counter)
        set @counter = @counter + @step
    end 
RETURN 
END
GO

-- USAGE
with cte as (
    select row_number() over (order by hist_report_Id) as row_num,
    hist_report_Id, report_name
    from tbl_report_history join tbl_report_definitions on hist_report_Id = rpt_reportId)
select value, hist_reportId, report_name 
from dbo.SetOfValues(1,10,1) as t on t.value = cte.row_num

<>你可以考虑使用一个TVF来返回一组你可以与之连接的数字:

CREATE FUNCTION SetOfValues (@beginningAt int, @endingAt int, @step int = 1)
RETURNS 
    @result TABLE (value int )
AS BEGIN
    declare @counter int set @counter = @beginningAt
    while(@counter<=@endingAt)
    begin
        insert into @result values(@counter)
        set @counter = @counter + @step
    end 
RETURN 
END
GO

-- USAGE
with cte as (
    select row_number() over (order by hist_report_Id) as row_num,
    hist_report_Id, report_name
    from tbl_report_history join tbl_report_definitions on hist_report_Id = rpt_reportId)
select value, hist_reportId, report_name 
from dbo.SetOfValues(1,10,1) as t on t.value = cte.row_num

Sql server版本?我想您需要某种类型的带有临时表或表变量的联合。Sql server版本?我想你需要一个临时表或表变量的某种联合。太好了!我希望有一个单一的语句解决方案,这是完美的工作。太好了!我希望有一个单一的语句解决方案,这是完美的。