web-dev-qa-db-fra.com

SELECT INTO une variable de table dans T-SQL

Vous avez une requête SELECT complexe, à partir de laquelle j'aimerais insérer toutes les lignes dans une variable de table, mais T-SQL ne le permet pas.

Dans le même ordre d'idées, vous ne pouvez pas utiliser une variable de table avec les requêtes SELECT INTO ou INSERT EXEC. http://odetocode.com/Articles/365.aspx

Petit exemple:

declare @userData TABLE(
                        name varchar(30) NOT NULL,
                        oldlocation varchar(30) NOT NULL
                       )

SELECT name, location
INTO @userData
FROM myTable
    INNER JOIN otherTable ON ...
WHERE age > 30

Les données de la variable de table seront ensuite utilisées pour les réinsérer/les remettre à jour dans différentes tables (principalement des copies des mêmes données avec des mises à jour mineures). Le but de ceci serait simplement de rendre le script un peu plus lisible et plus facilement personnalisable que de faire le SELECT INTO directement dans les bons tableaux. Les performances ne sont pas un problème, car la rowcount est relativement petite et ne peut être exécutée que manuellement lorsque cela est nécessaire.
... ou dites-moi si je me trompe complètement.

345
Indrek

Essayez quelque chose comme ça:

DECLARE @userData TABLE(
    name varchar(30) NOT NULL,
    oldlocation varchar(30) NOT NULL
);

INSERT INTO @userData (name, oldlocation)
SELECT name, location FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30;
554
CristiC

Le but de SELECT INTO est (selon la documentation, mon emphase)

Pour créer une nouvelle table à partir des valeurs d'une autre table

Mais vous avez déjà une table cible! Donc ce que vous voulez c'est

L'instruction INSERT ajoute une ou plusieurs nouvelles lignes à une table.

Vous pouvez spécifier les valeurs de données des manières suivantes:

...

En utilisant une sous-requête SELECT pour spécifier les valeurs de données pour une ou plusieurs lignes, telles que:

  INSERT INTO MyTable 
 (PriKey, Description)
        SELECT ForeignKey, Description
        FROM SomeView

Et dans cette syntaxe, il est permis que MyTable soit une variable de table.

90
AakashM

Vous pouvez également utiliser des expressions de table communes pour stocker des ensembles de données temporaires. Ils sont plus élégants et adhoc adhoc:

WITH userData (name, oldlocation)
AS
(
  SELECT name, location 
  FROM   myTable    INNER JOIN 
         otherTable ON ...
  WHERE  age>30
)
SELECT * 
FROM   userData -- you can also reuse the recordset in subqueries and joins
25
nanestev

Vous pouvez essayer d'utiliser des tables temporaires ... si vous ne le faites pas à partir d'une application. (Il peut être correct d'exécuter ceci manuellement)

SELECT name, location INTO #userData FROM myTable
INNER JOIN otherTable ON ...
WHERE age>30

Vous évitez ainsi de déclarer la table de cette façon ... Aide pour les requêtes ad hoc ... Ceci crée une table temporaire locale qui ne sera pas visible par les autres sessions, sauf si vous êtes dans la même session. Peut-être un problème si vous exécutez une requête à partir d'une application.

si vous avez besoin de l'utiliser sur une application, utilisez les variables déclarées de cette façon:

DECLARE @userData TABLE(
    name varchar(30) NOT NULL,
    oldlocation varchar(30) NOT NULL
);

INSERT INTO @userData
SELECT name, location FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30;

Edit: autant d’entre vous ont mentionné la visibilité mise à jour de la session depuis la connexion. La création de tables temporaires n'est pas une option pour les applications Web, car les sessions peuvent être réutilisées. Dans ce cas, respectez les variables temporaires.

15
Mulki

Essayez d'utiliser INSERT au lieu de SELECT INTO:

INSERT @UserData   
SELECT name, location etc.
8
Noel Abrahams

Commencez par créer une table temporaire:

étape 1:

create table #tblOm_Temp (

    Name varchar(100),
    Age Int ,
    RollNumber bigint
)

** Étape 2: ** Insérer une valeur dans la table Temp.

insert into #tblom_temp values('Om Pandey',102,1347)

Étape 3: Déclarer une table Variable pour contenir les données de la table temporaire.

declare   @tblOm_Variable table(

    Name Varchar(100),
    Age int,
    RollNumber bigint
)

Étape 4: sélectionnez la valeur dans la table temporaire et insérez-la dans la variable de la table.

insert into @tblOm_Variable select * from #tblom_temp

Enfin, la valeur est insérée dans une variable de table temporaire

Étape 5: Peut vérifier la valeur insérée dans la variable de table.

select * from @tblOm_Variable
5
404 Not found

OK, maintenant, avec assez d'effort, je peux insérer dans @table en utilisant ce qui suit:

INSERT @TempWithheldTable SELECT
a.SuspendedReason, a.SuspendedNotes, a.SuspendedBy, a.ReasonCode FROM OPENROWSET (BULK 'C:\DataBases\WithHeld.csv', FORMATFILE = N'C:\DataBases\Format.txt ',
ERRORFILE = N'C:\Temp\MovieLensRatings.txt ') AS a;

La principale chose ici est la sélection des colonnes à insérer.

1
RahulJha