2013-03-12 17 views
8

jestem corazkomunikat 'SELECT INTO' nie jest obsługiwany w tej wersji programu SQL Server - SQL Azure

Statement 'SELECT INTO' nie jest obsługiwany w tej wersji programu SQL Server w SQL Server

na poniższym zapytaniu wewnątrz procedura

DECLARE @sql NVARCHAR(MAX) 
,@sqlSelect NVARCHAR(MAX) = '' 
,@sqlFrom NVARCHAR(MAX) = '' 
,@sqlTempTable NVARCHAR(MAX) = '#itemSearch' 
,@sqlInto NVARCHAR(MAX) = '' 
,@params NVARCHAR(MAX) 


SET @sqlSelect ='SELECT  
,IT.ITEMNR 
,IT.USERNR 
,IT.ShopNR 
,IT.ITEMID'     

SET @sqlFrom =' FROM  dbo.ITEM AS IT' 
SET @sqlInto = ' INTO ' + @sqlTempTable + ' '; 

IF (@cityId > 0) 
    BEGIN 
     SET @sqlFrom = @sqlFrom + 
      ' INNER JOIN dbo.CITY AS CI2 
         ON CI2.CITYID = @cityId' 

     SET @sqlSelect = @sqlSelect + 
      'CI2.LATITUDE AS CITYLATITUDE 
      ,CI2.LONGITUDE AS CITYLONGITUDE' 
    END 

SELECT @params =N'@cityId int ' 

SET @sql = @sqlSelect [email protected] [email protected] 

EXEC sp_executesql @sql,@params 

mam około 50000 rekordów przechowywane, więc postanowiłem wykorzystać Temp tabela. Ale zaskoczony, widząc ten błąd.

Jak mogę osiągnąć to samo w SQL Azure?

Edit: Czytając ten blog http://blogs.msdn.com/b/sqlazure/archive/2010/05/04/10007212.aspx sugerujące nam stworzyć tabelę wewnątrz procedury składowanej do przechowywania danych, zamiast tabeli Temp. Czy jest bezpieczny pod współbieżnością? Czy osiągnie wydajność?

dodając kilka punktów pochodzi http://blog.sqlauthority.com/2011/05/28/sql-server-a-quick-notes-on-sql-azure/

  • każdym stole może mieć współczynnik klastrowy. Tabele bez indeksu klastrowanego nie są obsługiwane.
  • Każde połączenie może korzystać z pojedynczej bazy danych. Wiele baz danych w pojedynczej transakcji nie jest obsługiwane.
  • "USE DATABASE" nie może być używane na Azure.
  • Globalne tabele tempa (lub obiekty Temp) nie są obsługiwane.
  • Ponieważ nie ma koncepcji połączenia z krzyżową bazą danych, serwer połączony nie jest koncepcją na Azure w tej chwili.
  • SQL Azure to środowisko współdzielone, a z tego powodu nie ma koncepcji logowania do systemu Windows.
  • Zawsze upuść obiekty TempDB po ich potrzebie, ponieważ powodują nacisk na TempDB.
  • Podczas wkładania złotówki użyj opcji batchsize, aby ograniczyć liczbę wstawianych rzędów. Ogranicza to wykorzystanie przestrzeni dziennika transakcji.
  • Unikaj niepotrzebnego użycia grupowania lub blokowania ZAMÓWIENIA przez operacje, ponieważ prowadzą one do wykorzystania pamięci o wysokiej wydajności.
+0

Jednym z rozwiązań: http://stackoverflow.com/a/34877208/1151741 – Nigrimmist

Odpowiedz

2

Utwórz tabelę, używając prefiksu #, np. create table #itemsearch następnie użyj insert into. Zakres tabeli temp jest ograniczony do sesji, więc nie będzie problemów z współbieżnością.

+0

Tworzenie tabeli jest taka sama jak temp tabeli? Czy to jest bezpieczne? –

+1

Musisz użyć prefiksu '# 'podczas tworzenia tabeli, aby poinformować serwer, że jest to tabela tymczasowa. Na przykład. 'create table # itemsearch'. Dobrą praktyką jest jednak upuszczenie stołu po ukończeniu. Jeśli utworzysz tabelę bez '# ', prawdopodobnie będziesz mieć problemy z współbieżnością. –

+0

Liczba kolumn nie jest statyczna, różnią się one w zależności od warunku. Używam zapytania dynamicznego. Zaktualizowałem moje pytanie. W takim przypadku Jak mogę zbudować tabelę z dynamiczną kolumną i instrukcją INSERT? –

7

SELECT INTO to jedna z wielu rzeczy, których nie można niestety wykonać w SQL Azure.

Najpierw należy utworzyć tabelę tymczasową, a następnie wykonać wstawkę. Coś jak:

CREATE TABLE #itemSearch (ITEMNR INT, USERNR INT, IT.ShopNR INT, IT.ITEMID INT) 
INSERT INTO #itemSearch 
SELECT IT.ITEMNR, IT.USERNR, IT.ShopNR ,IT.ITEMID     
FROM dbo.ITEM AS IT 
+0

Z bloga, o którym mówiłem "SQL Azure wymaga, aby wszystkie tabele miały indeksy klastrowe, a zatem instrukcje SELECT INTO, które tworzą tabelę i nie obsługują tworzenia indeksów klastrowych". W tym przypadku muszę utworzyć klucz podstawowy. Czy to jest potrzebne? –

+0

Czy istnieje lista niefortunnych elementów dla SQL Azure? To będzie dla mnie pomocne. Tak więc mogłem uniknąć błędów na samym początku. –

+1

@Murali W przypadku tabel tymczasowych to nie jest potrzebne. Jeśli chodzi o tę listę, można ją znaleźć tutaj: http://msdn.microsoft.com/en-us/library/windowsazure/ee336253.aspx – mattytommo

-1

Cóż, jak wszyscy wiemy, tabela SQL Azure musi mieć indeksu klastrowego, dlatego SELECT INTO niewydolnością kopiowania danych z jednej tabeli do innej tabeli. Jeśli chcesz przeprowadzić migrację, najpierw musisz utworzyć tabelę o tej samej strukturze, a następnie wykonać instrukcję INSERT INTO. Dla tabeli tymczasowej, po której następuje # nie trzeba tworzyć indeksu.

how to create index and how to execute insert into for temp table?

Powiązane problemy