2010-10-01 19 views
271

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

W tych samych wierszach nie można używać zmiennej tabeli 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 tabeli zmiennej będzie później wykorzystane w celu dodania/aktualizowania go z powrotem do różnych tabel (głównie kopii tych samych danych z drobnych aktualizacji). Celem tego jest po prostu uczynienie skryptu bardziej czytelnym i łatwiejszym do dostosowania niż bezpośrednio w odpowiednich tabelach. Wydajność nie jest problemem, ponieważ rowcount jest dość mała i jest uruchamiana tylko ręcznie w razie potrzeby.
... lub po prostu powiedz mi, czy robię to wszystko źle.

Odpowiedz

423

spróbować 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; 
+0

Jeśli "SELECT name, location from myTable" jako wartości wstawiane do tabeli UserData nie ma znaczenia, czy nazwy zmiennych w wyborze odpowiadają nazwom w definicji tabeli. Wybierasz "name", aby wejść do "nazwy" zmiennej UserData, ale wybierasz "location" i jakoś przypisujesz ją do zmiennej "oldlocation" UserData. Czy SQL po prostu zmapuje je automatycznie, czy też rzuci jakiś wyjątek? –

+0

Nie ma znaczenia nazwa, tylko typ kolumny. – CristiC

+3

Wow, że ma to sens, ale jednocześnie parser we mnie czuje się trochę urażony :) –

6

spróbuje użyć INSERT zamiast SELECT INTO:

INSERT @UserData 
SELECT name, location etc. 
12

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

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

pominąć wysiłek, aby zadeklarować tablicę w ten sposób ... Pomaga dla zapytań ad hoc ... Tworzy lokalną tabelę tymczasową, która nie będzie widoczna dla innych połączeń, chyba że używasz tego samego połączenia w całej aplikacji.

jeśli wymagają zmiennych może zostać uznane 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; 
+2

Przepraszam, zapomniałem wspomnieć, że nie mam uprawnień do CREATE TABLE. – Indrek

+6

Tworzenie temp ma nieco więcej narzutów. – Paparazzi

+2

używanie tabeli tymczasowej nie zawsze jest bezpieczne. Na przykład usługi internetowe.W przypadku usług sieciowych z jednym połączeniem w celu ograniczenia maksymalnego połączenia na serwerze ORAZ bezpiecznego zabezpieczenia SQL, tabela tymczasowa będzie istniała dla KAŻDEJ kwerendy przechodzącej i może zastąpić osobę aktualnie używającą tego. – Franck

77

Celem SELECT INTO jest (za Dokumentów, podkreślenie moje)

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

Ale już ma miejsce docelowe! Więc to, co chcesz

Oświadczenie INSERT dodaje jeden lub więcej nowych wierszy do tabeli

Można określić wartości danych w następujących sposobów:

...

Stosując SELECT podkwerenda określić wartości danych dla jednego lub kilku rzędach, takich jak:

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

I ta składnia, to pozwoliło na MyTable być zmienna stół .

+0

Dzięki za wyjaśnienie! – Indrek

+0

Naprawdę chciałbym, aby zaakceptowana odpowiedź zawierała te informacje! –

+0

Dostaję MyTable "Nieprawidłowy obiekt nazwa" robi to, więc czegoś brakuje w tej odpowiedzi. –

-4

Jednym z powodów użyć SELECT INTO jest to, że pozwala na używanie Tożsamość:

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

To nie będzie działać ze zmienną tabeli, która jest tak źle ...

+5

Możesz zadeklarować zmienną tabeli z kolumną 'TOŻSAMOŚĆ'. –

4

Najpierw utwórz temp tabela:

Etap 1:

create table #tblOm_Temp (

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

** Krok 2: ** Wstaw wartość do tabeli Temp.

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

Krok 3: zadeklarować zmienną tabelę do przechowywania danych tabeli temp.

declare @tblOm_Variable table(

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

Etap 4: dobrać wartość z tabeli temp i wstawić do zmiennej tabeli.

insert into @tblOm_Variable select * from #tblom_temp 

Na koniec dodaje się wartość z tabeli temp Tabeli zmienna

Etap 5: można sprawdzić wstawiony wartość zmiennej tabeli.

select * from @tblOm_Variable 
13

Można również używać typowych wyrażeń tabel do przechowywania tymczasowych zestawów danych. Są bardziej elegancki i przyjazny 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 
+0

Uwielbiam to! Dziękuję Ci. – fourpastmidnight

0

OK, teraz wystarczająco dużo wysiłku mogę wstawić do @table używając poniżej:

INSERT @TempWithheldTable SELECT
a.SuspendedReason, a.SuspendedNotes, a.SuspendedBy, a.ReasonCode Z OPENROWSET (bulk 'C: \ baz danych \ WithHeld.csv' FORMATFILE = N'C: \ \ Format.txt baz danych”
errorfile = N'C : \ Te mp \ MovieLensRatings.txt ' ) AS a;

Najważniejszą rzeczą jest tutaj wybór kolumn do wstawienia.

Powiązane problemy