Insérer des données dans une table temporaire avec une requête

144

J'ai une requête existante qui génère des données actuelles, et je voudrais l'insérer dans une table temporaire, mais j'ai des problèmes pour le faire. Quelqu'un aurait-il une idée de la façon de procéder?

Voici un exemple

SELECT *
FROM  (SELECT Received,
              Total,
              Answer,
              ( CASE
                  WHEN application LIKE '%STUFF%' THEN 'MORESTUFF'
                END ) AS application
       FROM   FirstTable
       WHERE  Recieved = 1
              AND application = 'MORESTUFF'
       GROUP  BY CASE
                   WHEN application LIKE '%STUFF%' THEN 'MORESTUFF'
                 END) data
WHERE  application LIKE isNull('%MORESTUFF%', '%') 

Cela semble afficher mes données actuellement de la manière dont j'en ai besoin, mais je voudrais les transmettre dans une table temporaire. Mon problème est que je suis assez nouveau dans les requêtes SQL et que je n'ai pas été en mesure de trouver un moyen de le faire. Ou si c'est même possible. Si ce n'est pas possible, y a-t-il un meilleur moyen d'obtenir les données que je recherche WHERE application LIKE isNull('%MORESTUFF%','%')dans une table temporaire?

bouc émissaire17
la source
2
Dans une #temptable qui existe déjà ou il faudrait en créer une nouvelle?
Martin Smith
1
@MartinSmith - Ce serait un nouveau.
bouc émissaire17
1
LIKE ISNULL('%MORESTUFF%', '%')sera toujours le même que LIKE '%MORESTUFF%', n'est-ce pas? Puisque '% MORESTUFF%' (le littéral de chaîne) n'est jamais nul?
gnud

Réponses:

188
SELECT *
INTO #Temp
FROM

  (SELECT
     Received,
     Total,
     Answer,
     (CASE WHEN application LIKE '%STUFF%' THEN 'MORESTUFF' END) AS application
   FROM
     FirstTable
   WHERE
     Recieved = 1 AND
     application = 'MORESTUFF'
   GROUP BY
     CASE WHEN application LIKE '%STUFF%' THEN 'MORESTUFF' END) data
WHERE
  application LIKE
    isNull(
      '%MORESTUFF%',
      '%')
Yosi Dahari
la source
149

SQL Server R2 2008 a besoin de la ASclause suivante:

SELECT * 
INTO #temp
FROM (
    SELECT col1, col2
    FROM table1
) AS x

La requête a échoué sans le AS xà la fin.


ÉDITER

Il est également nécessaire lors de l'utilisation de SS2016, a dû ajouter as tà la fin.

 Select * into #result from (SELECT * FROM  #temp where [id] = @id) as t //<-- as t
Shaun Luttin
la source
5
Intéressant. J'ai juste eu le même problème. L'ajout de "As [x]" à la fin a fait que tout fonctionnait parfaitement. Pourquoi est-ce?
godfathr
5
@godfathr c'est parce que la clause from utilise une table dérivée
wootscootinboogie
35

Le moyen le plus rapide de le faire est d'utiliser la commande "SELECT INTO", par exemple

SELECT * INTO #TempTableName
FROM....

Cela créera une nouvelle table, vous n'avez pas à la créer à l'avance.

Yuriy Galanter
la source
Est-il possible d'ajouter des colonnes à #TempTableName?
FrenkyB
@FrenkyB oui, une fois la table créée, vous pouvez utiliser l'instruction ALTER TABLE ADD COLUMN
Yuriy Galanter
12

Personnellement, j'avais besoin d'un petit coup de main pour savoir comment l'utiliser et c'est vraiment génial.

IF(OBJECT_ID('tempdb..#TEMP') IS NOT NULL) BEGIN DROP TABLE #TEMP END
        SELECT *
            INTO #TEMP
            FROM (
            The query you want to use many times
            ) AS X

SELECT * FROM #TEMP WHERE THIS = THAT
SELECT * FROM #TEMP WHERE THIS <> THAT
SELECT COL1,COL3 FROM #TEMP WHERE THIS > THAT

DROP TABLE #TEMP
theteague
la source
8

Vous pouvez le faire comme ceci:

INSERT INTO myTable (colum1, column2)
SELECT column1, column2 FROM OtherTable;

Assurez-vous simplement que les colonnes correspondent, à la fois en nombre et en type de données.

wvdz
la source
5

Essaye ça:

SELECT *
INTO #Temp
FROM 
(select * from tblorders where busidate ='2016-11-24' and locationID=12
) as X

Veuillez utiliser un alias avec x pour que le script et le résultat n'échouent pas.

Alok Sharma
la source
3
SELECT * INTO #TempTable 
FROM SampleTable
WHERE...

SELECT * FROM #TempTable
DROP TABLE #TempTable
Saqib A. Azhar
la source
2

C'est possible. Essayez de cette façon:

Create Global Temporary Table 
BossaDoSamba 
On Commit Preserve Rows 
As 
select ArtistName, sum(Songs) As NumberOfSongs 
 from Spotfy 
    where ArtistName = 'BossaDoSamba'
 group by ArtistName;
Luiz Henrique Lima
la source