Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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
C# 带限制的SQL查询_C#_Sql_Sql Server - Fatal编程技术网

C# 带限制的SQL查询

C# 带限制的SQL查询,c#,sql,sql-server,C#,Sql,Sql Server,我在SQL Server中有此表: ID | videoid | title ========================= 1 | id1 | title1 2 | id2 | title2 3 | id3 | title3 我想创建一个select方法,在标题行中搜索: SELECT * FROM [movie].[dbo].[movies] WHERE title like '%' + '%s' + '%' 我在MySQL中寻

我在SQL Server中有此表:

ID   | videoid  | title
=========================
1    | id1      | title1
2    | id2      | title2
3    | id3      | title3
我想创建一个select方法,在标题行中搜索:

SELECT * FROM [movie].[dbo].[movies] 
WHERE title like '%' + '%s' + '%'
我在MySQL中寻找类似Limit的东西,从SELECT结果中我可以得到0-20,21-40,41-60的结果

有关于这个问题的帮助吗

我尝试使用限制0和10,但收到以下错误:

Could not find stored procedure 'LIMIT'.
使用顶部:

当TOP与ORDERBY子句一起使用时,结果集被限制为前N个有序行;否则,它将以未定义的顺序返回前N行

阅读更多

要获得类似10-20的结果,请使用行号:

您需要在SQL SERVER中使用TOP N

SELECT TOP 10 * FROM [movie].[dbo].[movies] 
WHERE title like '%' + '%s' + '%'
ORDER BY SomeColumn -- Specify your column for ordering
见:

将查询结果集中返回的行限制为指定的数目 SQL Server中的行数或行百分比

也看看下面

在SELECT语句中,始终将ORDER BY子句与TOP 条款这是可预测地指示哪些行是 受顶部影响

如果您正在查找分页记录,那么您将需要

我认为SQL server没有限制。改用TOP。TOP返回查询的前N行,因此如果它是前10行,即使有1000行,它也只返回前10行。试试这个

SELECT TOP 60 * 
FROM [movie].[dbo].[movies] 
WHERE title like '%' + '%s' + '%'

在T-SQL中没有等价物。TOP仅允许从结果集中获取前x个结果。你可以使用一个技巧。使用ROW_NUMBER可以添加一个从1开始并自动递增的新列

像这样:

SELECT ROW_NUMBER OVER (SomeExpression), Field FROM ...
然后你可以用

SELECT TOP x FROM
(
    SELECT ROW_NUMBER OVER (ORDER BY ID) AS RowNumber, ID, videoid, title FROM ...
) tmp
WHERE RowNumber > Y ORDER BY RowNumber ASC
诀窍在于,此编号独立于其他字段,因此使用相同的筛选器,您将始终获得相同的行号,从而可以再次进行筛选。这模仿了极限的作用

例如,要获取条目1-9,您可以编写:

SELECT TOP 9 FROM
(
    SELECT ROW_NUMBER OVER (ORDER BY ID) AS RowNumber, ID, videoid, title FROM ...
) tmp
WHERE RowNumber >= 1 ORDER BY RowNumber ASC
下一页:

SELECT TOP 9 FROM
(
    SELECT ROW_NUMBER OVER (ORDER BY ID) AS RowNumber, ID, videoid, title FROM ...
) tmp
WHERE RowNumber >= 10 ORDER BY RowNumber ASC
在SQL Server 2012中,引入了一项新功能来提供此功能

请看这张照片的偏移部分

这将返回按某个列排序的结果集的结果20-30

对于SQL Server 2005-2008R2,您可以使用窗口函数执行相同的操作:

SELECT *
FROM   (
        SELECT *
             , Row_Number() OVER (ORDER BY some_column) As sequence
        FROM   your_table
       ) As a_subquery
WHERE  sequence >= 20
AND    sequence <= 30
对于SQL Server 2005之前的SQL Server版本,没有有效的方法来实现此效果。下面是一些能起作用的东西:

SELECT *
FROM   (
        SELECT *
             , (
                SELECT Count(*)
                FROM   your_table As x
                WHERE  x.some_column <= your_table.some_column
               ) As sequence
        FROM   your_table
       ) As a_subquery
WHERE  sequence >= 20
AND    sequence <= 30
最后一点:要想让你的结果更真实,某个列应该是唯一的。如果不是,则需要在等式中添加额外的列,为序列提供确定的排序顺序


还请注意,选择*。。。应避免在所有生产代码中使用。不要偷懒[就像我在这个答案中;-]-只列出所需的列。

为此,您可以使用以下方法:

方法1:按订单

方法2:行数


另外,我认为您的“%”太多了。您使用此sql的目标是什么?您打算在哪里使用它?可能重复使用@RaimondKuipers我想构建Web服务,以获取搜索字符串并从sql数据库返回结果。但我希望每次返回20个结果,而不是所有结果。@MTA,您是每次返回20个结果,还是希望根据分页返回结果,如第一次调用0-20,第二次调用20-40?这不允许分页作为限制,然而,这并没有达到极限,因为你不能得到10-20的结果。@ThorstenDittmar:谢谢。编辑我的答案。如果没有ORDER BY,TOP没有任何意义,应该使用Yes for paging。如果没有ORDER BY,TOP没有任何意义。@ThorstenDittmar,你确定吗?因为我认为SELECT只是以不确定的顺序返回记录,是不是因为TOP关键字,返回的结果会按照PK的顺序排列?@ThorstenDittmar几乎总是@gvee这是真的,但在某些情况下,就像在我们客户的数据库中一样,我只需要从一组行中获取第一个值,因为它对于所有行都是相等的,所以我不需要ORDER BY。有人可以理直气壮地说,数据模型本身就是一个WTF,但这不是本文的主题:-D
SELECT *
FROM   your_table
ORDER
    BY some_column
       OFFSET 20 ROWS
       FETCH NEXT 10 ROWS ONLY
SELECT *
FROM   (
        SELECT *
             , Row_Number() OVER (ORDER BY some_column) As sequence
        FROM   your_table
       ) As a_subquery
WHERE  sequence >= 20
AND    sequence <= 30
SELECT *
FROM   (
        SELECT *
             , (
                SELECT Count(*)
                FROM   your_table As x
                WHERE  x.some_column <= your_table.some_column
               ) As sequence
        FROM   your_table
       ) As a_subquery
WHERE  sequence >= 20
AND    sequence <= 30
SELECT * 
FROM [movie].[dbo].[movies] 
WHERE title like '%' + '%s' + '%'
ORDER BY ID OFFSET 21 ROWS FETCH NEXT 20 ROWS ONLY
SELECT *
FROM (  SELECT *,
                ROW_NUMBER()OVER (ORDER BY ID)row
        FROM [movie].[dbo].[movies]
        WHERE title like '%' + '%s' + '%'
    )z
WHERE row>20
    AND row<=40
SELECT TOP 20 *
FROM (  SELECT TOP 40 *
        FROM [movie].[dbo].[movies] 
        WHERE title like '%' + '%s' + '%'
        ORDER BY ID
    )z
ORDER BY ID DESC