2010-09-20 1 views
0

avec tmp_rows comme ( select * from [dbo] [client] .)T-SQL Pourquoi ne puis-je me référer qu'une fois à un objet temporaire?

select * from tmp_rows; 
select count(*) from tmp_rows; 

Je ne peux pas obtenir le nombre des tmp_rows parce que je reçois l'erreur: Nom d'objet incorrect 'tmp_rows'

Si je commente le « select * » tout est OK requête

je dois sélectionner toutes les lignes et obtenir leur nombre, comment faire?

+0

POURQUOI auriez-vous besoin de cela? Le premier résultat contient le nombre de lignes car il contient les lignes. – Guffa

+2

Les CTE ne sont pas vraiment des objets temporaires en ce sens qu'ils sont matérialisés à l'avance dans SQL Server. Ils sont traités à peu près de la même manière que les tables dérivées. –

Répondre

4
with tmp_rows as 
(
    select * from [dbo].[customer] 
) 

select * from tmp_rows; 
select @@rowcount; 

par déclaration que vous avez déclaré à l'utilisation with vous déclarez un CTE - plus d'informations sur les CTE se trouvent here

+0

Hm, mais le @@ rowcount est la variable globale, la même pour tous les clients connectés à SQL Server? – Tony

+1

@Tony - si @@ ROWCOUNT a agi comme vous le supposez, à quoi cela servirait-il? –

+0

En fait, avec cette solution, le CTE est totalement inutile. Vous obtenez la même chose avec simplement 'select * from dbo.customer, sélectionnez @@ rowcount'. – Guffa

4

Un objet temporaire créé en utilisant le mot-clé with ne peut être utilisé qu'une seule fois. Vous pouvez créer une table temporaire si vous voulez l'utiliser plus d'une fois:

select * 
into #tmp_tows 
from dbo.customer 

select * from #tmp_rows 

select count(*) from #tmp_rows 

drop table #tmp_rows 

Cela fonctionne même si vous voulez faire quelque chose de différent avec le résultat deux fois, par exemple obtenir le décompte avant que le résultat.

1

Le CTE commençant par WITH se termine par le point-virgule ;.

Mais vous pouvez avoir plus de 1 CTE dans WITH:

with tmp_rows as 
(
    select * from [dbo].customer 
), 
count_rows as 
(
    select COUNT(*) count_rows from tmp_rows 
) 
select * from count_rows, tmp_rows; 
+0

Remarque: Cela inclura le nombre dans chaque ligne du résultat au lieu d'un résultat séparé. – Guffa

0

tmp_rows est une expression de table commune (CTE) et CTEs ont une portée au niveau de l'instruction:

-- 1st statement, works fine. 
with tmp_rows as (select * from [dbo].[customer]) 
select * from tmp_rows; 

-- 2nd statement, returns an error, since tmp_rows is out of scope. 
select count(*) from tmp_rows; 

Au moment où votre deuxième instruction s'exécute, tmp_rows est déjà hors de portée. Sachez que les CTE ont une portée locale vues, pas des tables. L'ensemble de résultats n'est jamais matérialisé. Si vous devez matérialiser un jeu de résultats, utilisez plutôt une table temporaire locale ou une variable de table.