Kreeg een complexe selecteverzoek, waarvan ik alle rijen in een tabelvariabele wil invoegen, maar T-SQL staat het niet toe.
Langs dezelfde regels, kunt u geen tabelvariabele gebruiken met Select in of Invin Exec-query’s.
http://odetocode.com/articles/365.aspx
Kort voorbeeld:
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
De gegevens in de tabelvariabele zouden later worden gebruikt om het in te voegen / bijwerken in verschillende tabellen (meestal kopie van dezelfde gegevens met kleine updates). Het doel hiervan zou zijn om eenvoudig het script een beetje leesbaarder en gemakkelijker aanpasbaar te maken dan het doen van de SELECT INTO
rechtstreeks in de juiste tafels.
Prestaties is geen probleem, zoals de rowcount
redelijk klein is en het alleen handmatig wordt uitgevoerd wanneer dat nodig is.
… of vertel me gewoon of ik het helemaal verkeerd doe.
Antwoord 1, Autoriteit 100%
Probeer zoiets:
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;
Antwoord 2, Autoriteit 15%
Het doel van SELECT INTO
is (per de Documenten, mijn nadruk)
Naar Maak een nieuwe tabel uit waarden in een andere tabel
Maar u al heeft een doeltabel! Dus wat je wilt is
De
INSERT
Verklaring voegt een of meer nieuwe rijen toe aan een tabelU kunt de gegevenswaarden opgeven in de
volgende manieren:…
Door gebruik te maken van een
SELECT
Subquery om op te geven
de gegevenswaarden voor een of meer rijen,
Zoals:INSERT INTO MyTable (PriKey, Description) SELECT ForeignKey, Description FROM SomeView
En in Deze syntaxis, is het toegestaan voor MyTable
om een tabelvariabele te zijn.
Antwoord 3, Autoriteit 5%
U kunt ook gebruikmaken van gemeenschappelijke tabeluitdrukkingen om tijdelijke datasets op te slaan. Ze zijn eleganter en adhoc-vriendelijk:
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
Antwoord 4, Autoriteit 2%
U kunt proberen tijdelijke tafels te gebruiken … als u het niet uit een aanvraag doet. (Het kan goed zijn om deze handmatig uit te voeren)
SELECT name, location INTO #userData FROM myTable
INNER JOIN otherTable ON ...
WHERE age>30
U slaat de inspanning over om de tabel op die manier te verklaren …
Helpt bij Adhoc-query’s … Dit creëert een lokale temperatuurtafel die niet zichtbaar is voor andere sessies, tenzij u zich in dezelfde sessie bevindt. Misschien een probleem als u query van een app gebruikt.
Als u nodig heeft om op een app te gebruiken, gebruikt u variabelen die op deze manier worden uitgeroepen:
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: Zoals velen van u hebben bijgewerkt zichtbaarheid naar sessie vanuit verbinding. Temp-tabellen maken is geen optie voor webtoepassingen, omdat sessies kunnen worden hergebruikt, vast te houden aan TEMP-variabelen in die gevallen
Antwoord 5
Maak eerst een temp-tabel:
Stap 1:
create table #tblOm_Temp (
Name varchar(100),
Age Int ,
RollNumber bigint
)
** Stap 2: ** Voeg een waarde in de temp-tabel in.
insert into #tblom_temp values('Om Pandey',102,1347)
Stap 3: Verklaar een tabelvariabele om temp-tabelgegevens te houden.
declare @tblOm_Variable table(
Name Varchar(100),
Age int,
RollNumber bigint
)
Stap 4: Selecteer waarde van Temp Table en plaats in tabelvariabele.
insert into @tblOm_Variable select * from #tblom_temp
Ten slotte wordt de waarde ingevoegd vanaf een temp-tabel naar tabelvariabele
Stap 5: kan ingevoegde waarde in tabelvariabele controleren.
select * from @tblOm_Variable
Antwoord 6
Probeer INSERT
te gebruiken in plaats van SELECT INTO
:
DECLARE @UserData TABLE(
name varchar(30) NOT NULL,
oldlocation varchar(30) NOT NULL
)
INSERT @UserData
SELECT name, oldlocation
Antwoord 7
OK, nu met voldoende inspanning kan ik in @table invoegen met behulp van het onderstaande:
INSERT @TempWithheldTable SELECT
a.OpgeschortReden,
a.OpgeschortOpmerkingen,
a.Opgeschort door ,
a.Redencode VAN OPENROWSET (BULK ‘C:\DataBases\WithHeld.csv’, FORMATFILE =
N’C:\DataBases\Format.txt’,
ERRORFILE=N’C:\Temp\MovieLensRatings.txt’
) ALS een;
Het belangrijkste hier is het selecteren van kolommen om in te voegen.
Antwoord 8
Een reden om SELECT INTO te gebruiken, is dat u IDENTITY kunt gebruiken:
SELECT IDENTITY(INT,1,1) AS Id, name
INTO #MyTable
FROM (SELECT name FROM AnotherTable) AS t
Dit zou niet werken met een tabelvariabele, wat jammer is…