Selecteer in een tabelvariabele in T-SQL

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 INTOrechtstreeks in de juiste tafels.
Prestaties is geen probleem, zoals de rowcountredelijk 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 INTOis (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 INSERTVerklaring voegt een of meer nieuwe rijen toe aan een tabel

U kunt de gegevenswaarden opgeven in de
volgende manieren:

Door gebruik te maken van een SELECTSubquery 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 MyTableom 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 INSERTte 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…

Other episodes