SELECT INTO A Table variable in T-SQL

Otrzymałem złożone zapytanie SELECT, z którego chciałbym wstawić wszystkie wiersze do zmiennej tabeli, ale T-SQL na to nie pozwala.

W tych samych wierszach nie można używać zmiennej table z zapytaniami SELECT INTO lub INSERT Exec. http://odetocode.com/Articles/365.aspx

Krótki przykład:

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

DANE w zmiennej table będą później używane do wstawiania/aktualizowania ich z powrotem do różnych tabel (głównie Kopia tych samych danych z drobnymi aktualizacjami). Celem tego byłoby po prostu uczynienie skryptu nieco bardziej czytelnym i łatwiejszym do dostosowania niż wykonywanie SELECT INTO bezpośrednio w odpowiednich tabelach. Wydajność nie jest problemem, ponieważ rowcount jest dość mały i jest uruchamiany ręcznie tylko w razie potrzeby.
...albo powiedz mi, czy robię to źle.

Author: iamdave, 2010-10-01

8 answers

Spróbuj czegoś takiego:

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;
 472
Author: CristiC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-17 23:13:12

Celem SELECT INTO jest (zgodnie z docs, mój nacisk)

Do Utwórz nową tabelę z wartości w innej tabeli

Ale ty już masz } tabelę docelową! So what you want is

Instrukcja INSERT dodaje jeden lub więcej nowych wierszy do Tabeli

Możesz określić wartości danych w następujące sposoby:

...

Używając subquery SELECT, aby określić wartości danych dla jednego lub więcej wierszy, takie jak:

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

I w tej składni dopuszcza się, aby MyTable była zmienną tabel.

 80
Author: AakashM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-01 10:28:52

Do przechowywania tymczasowych zbiorów danych można również używać popularnych wyrażeń tabel. Są bardziej eleganckie i przyjazne 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
 18
Author: nanestev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-22 16:54:43

Możesz spróbować użyć tabel tymczasowych...

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

Pomiń wysiłek, aby zadeklarować tabelę w ten sposób... Pomaga w zapytaniach adhoc...Tworzy to lokalną tabelę tymczasową, która nie będzie widoczna dla innych połączeń, chyba że użyjesz tego samego połączenia w całej aplikacji.

Jeśli potrzebujesz zmiennych, można je zadeklarować w ten sposób:

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;
 13
Author: Mulki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-18 20:18:46

Spróbuj użyć INSERT zamiast SELECT INTO:

INSERT @UserData   
SELECT name, location etc.
 6
Author: Noel Abrahams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-15 19:13:20

Najpierw Utwórz tabelę temp:

Krok 1:

create table #tblOm_Temp (

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

**Krok 2: * * Wstaw jakąś wartość w tabeli Temp .

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

Krok 3: Zadeklaruj zmienną tabelkową do przechowywania danych tabeli temp.

declare   @tblOm_Variable table(

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

Krok 4: wybierz wartość z tabeli temp i wstaw do zmiennej table.

insert into @tblOm_Variable select * from #tblom_temp

Ostatecznie wartość jest wstawiana z tabeli temp do zmiennej Table

Krok 5: może sprawdzić wstawioną wartość w zmiennej table.

select * from @tblOm_Variable
 4
Author: 404 Not found,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-22 04:43:43

OK, teraz z wystarczającym wysiłkiem jestem w stanie wstawić do @table używając poniższego:

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

Najważniejsze jest wybranie kolumn do wstawienia .

 0
Author: RahulJha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-22 09:29:53

Jednym z powodów użycia SELECT INTO jest to, że pozwala na użycie tożsamości:

SELECT IDENTITY(INT,1,1) AS Id, name
INTO #MyTable 
FROM (SELECT name FROM AnotherTable) AS t

To nie zadziała ze zmienną tabelkową, co jest przykre...

 -4
Author: MOHCTP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-23 00:20:30