Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como SET ROWCOUNT funciona no SQL Server


No SQL Server, você pode usar SET ROWCOUNT para limitar as linhas retornadas por uma consulta.

A maneira como funciona é que faz com que o SQL Server pare de processar a consulta após o número especificado de linhas ser retornado.

É semelhante ao TOP() cláusula, mas com a diferença de que SET ROWCOUNT é definido fora da consulta e afetará todas as consultas subsequentes.

Exemplo


Aqui está um exemplo para demonstrar.

Primeiro, vamos fazer uma consulta sem configurando ROWCOUNT .
SELECT * FROM Dogs;

Resultado:
+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
| 1002    | Fetch     |
+---------+-----------+
(4 rows affected)

Portanto, quatro linhas são retornadas sem definir ROWCOUNT .

Agora vamos usar SET ROWCOUNT para limitar o número de linhas e execute a consulta novamente.
SET ROWCOUNT 2;
SELECT * FROM Dogs;

Resultado:
+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
+---------+-----------+
(2 rows affected)

Consultas subsequentes


Como mencionado, SET ROWCOUNT afeta todas as consultas subsequentes.

Se eu executar a consulta a seguir imediatamente após a anterior, duas linhas também serão retornadas.
SELECT * FROM Cats;

Resultado:
+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
+---------+-----------+
(2 rows affected)

Isso ocorre apesar do fato de que três linhas teriam sido retornadas, se eu não tivesse usado SET ROWCOUNT para limitar as linhas que estão sendo retornadas.

Posso verificar isso com o COUNT() cláusula.
SELECT COUNT(*) FROM Cats;

Resultado:
+--------------------+
| (No column name)   |
|--------------------|
| 3                  |
+--------------------+

Redefinir ROWCOUNT


Você pode redefinir o ROWCOUNT valor dando-lhe um valor de 0 (zero).

Isso significa que as consultas não terão mais seus resultados limitados. A consulta continuará sendo processada até o final.
SET ROWCOUNT 0;
SELECT * FROM Cats;

Resultado:
+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+
(3 rows affected)

ROWCOUNT vs TOP()


Se você usar o TOP() cláusula em uma consulta quando você já definiu seu ROWCOUNT , seu ROWCOUNT configuração só substituirá TOP() se ROWCOUNT é o menor valor.

Aqui está um exemplo em que ROWCOUNT é o maior valor.
SET ROWCOUNT 3;
SELECT TOP(2) * FROM Dogs;

Resultado:
+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
+---------+-----------+
(2 rows affected)

Neste caso, o TOP() cláusula venceu.

E aqui está um exemplo em que ROWCOUNT é o menor valor.
SET ROWCOUNT 1;
SELECT TOP(2) * FROM Dogs;

Resultado:
+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
+---------+-----------+
(1 row affected)

Compatibilidade


Observe que a Microsoft recomenda que SET ROWCOUNT não afetará DELETE , INSERT e UPDATE instruções em uma versão futura do SQL Server. A Microsoft recomenda que você evite esse uso em novos trabalhos de desenvolvimento e planeje modificar os aplicativos que o utilizam atualmente.

A Microsoft recomenda usar o TOP() cláusula se você precisar limitar as linhas afetadas em DELETE , INSERT e UPDATE declarações.

Cuidado


O ROWCOUNT A opção funciona na maioria das instruções T-SQL, incluindo gatilhos. No entanto, ele não afeta os cursores dinâmicos, mas limita o conjunto de linhas de conjunto de chaves e cursores insensíveis. Esta opção deve, portanto, ser usada com cautela.