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.
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;
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.
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
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.
Essayez d'utiliser INSERT
au lieu de SELECT INTO
:
INSERT @UserData
SELECT name, location etc.
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
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.