2013-03-12 11 views
8

sto ottenendoDichiarazione 'SELECT' non è supportato in questa versione di SQL Server - SQL Azure

Statement 'SELECT' non è supportato in questa versione di SQL Server in SQL Server

per la query di seguito all'interno stored procedure

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 

ho circa 50.000 record, così ha deciso di utilizzare Temp tabella. Ma sorpreso di vedere questo errore.

Come posso ottenere lo stesso in SQL Azure?

Modifica: Leggere questo blog http://blogs.msdn.com/b/sqlazure/archive/2010/05/04/10007212.aspx suggerendoci di CREARE una tabella all'interno della procedura memorizzata per la memorizzazione dei dati anziché la tabella Temp. È sicuro in concorrenza? Colpirà le prestazioni?

Aggiunta alcuni punti presi da http://blog.sqlauthority.com/2011/05/28/sql-server-a-quick-notes-on-sql-azure/

  • Ciascuna tabella deve avere indice cluster. Le tabelle senza indice cluster non sono supportate.
  • Ogni connessione può utilizzare un singolo database. Il database multiplo in una singola transazione non è supportato.
  • 'USE DATABASE' non può essere utilizzato in Azure.
  • Le tabelle temporali globali (o gli oggetti temporali) non sono supportate.
  • Poiché non esiste un concetto di connessione a database incrociato, il server collegato non è il concetto in Azure in questo momento.
  • SQL Azure è un ambiente condiviso e, a causa della stessa, non esiste il concetto di accesso a Windows.
  • Lascia sempre oggetti TempDB dopo la loro necessità mentre creano pressione su TempDB.
  • Durante l'inserimento buck utilizzare l'opzione batchsize per limitare il numero di righe da inserire. Ciò limiterà l'utilizzo dello spazio del log delle transazioni.
  • Evitare l'uso non necessario del raggruppamento o del blocco ORDINA in base alle operazioni che portano all'utilizzo della memoria di fascia alta.
+0

One da soluzioni: http://stackoverflow.com/a/34877208/1151741 – Nigrimmist

risposta

2

Creare la tabella utilizzando il prefisso #, ad es. create table #itemsearch quindi utilizzare insert into. L'ambito della tabella temporanea è limitato alla sessione, quindi non ci saranno problemi di concorrenza.

+0

Crea una tabella è lo stesso come tabella temporanea? È sicuro? –

+1

È necessario utilizzare il prefisso '#' quando si crea la tabella per comunicare al server che si tratta di una tabella temporanea. Per esempio. 'crea table # itemsearch'. È comunque buona pratica lasciare il tavolo dopo aver finito, comunque. Se crei una tabella senza '#' probabilmente avrai problemi di concorrenza .. –

+0

Il no delle colonne non è statico, varia in base alle condizioni. Sto usando la query dinamica. Ho aggiornato la mia domanda. In questo caso, come posso creare una tabella con colonna dinamica e istruzione INSERT? –

7

SELECT INTO è una delle molte cose che purtroppo non è possibile eseguire in SQL Azure.

Quello che dovresti fare è prima creare la tabella temporanea, quindi eseguire l'inserimento. Qualcosa di simile:

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

Dal blog che ho riferito 'SQL Azure richiede che tutte le tabelle abbiano indici cluster quindi SELECT INTO istruzioni, che crea una tabella e non supporta la creazione di indici cluster'. In questo caso ho bisogno di creare una chiave primaria. È necessario? –

+0

Esiste un elenco di elementi sfavorevoli per SQL Azure? Sarà utile per me. Così ho potuto evitare errori all'inizio stesso –

+1

@Murali Nel caso di tabelle temporanee, non è necessario. Per quanto riguarda l'elenco, è possibile trovarlo qui http://msdn.microsoft.com/en-us/library/windowsazure/ee336253.aspx – mattytommo

-1

bene, come tutti sappiamo tabella SQL Azure deve avere un indice cluster, è per questo che SELECT INTO copia dei dati di guasto da una tabella a un'altra tabella. Se si desidera eseguire la migrazione, è necessario creare prima una tabella con la stessa struttura e quindi eseguire l'istruzione INSERT INTO. Per la tabella temporanea seguita da # non è necessario creare l'indice.

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