2013-03-12 32 views
8

我越來越聲明 'SELECT INTO' 不支持這個版本的SQL Server - SQL Azure的

聲明 'SELECT INTO' 在這個版本的SQL Server 的SQL Server中不支持

爲下面查詢中的存儲過程

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 

我有大約50,000條記錄,所以決定使用臨時表。但很驚訝地看到這個錯誤。

我如何在SQL Azure中實現相同?

編輯:讀這個博客http://blogs.msdn.com/b/sqlazure/archive/2010/05/04/10007212.aspx建議我們在存儲過程中創建一個表來存儲數據而不是臨時表。併發性是否安全?它會達到性能嗎?從http://blog.sqlauthority.com/2011/05/28/sql-server-a-quick-notes-on-sql-azure/

  • 每個表採取

    添加一些點必須聚集索引。不支持聚簇索引的表。

  • 每個連接都可以使用單個數據庫。單個事務中的多個數據庫不受支持。
  • 'USE DATABASE'不能在Azure中使用。
  • 不支持全局臨時表(或臨時對象)。
  • 由於沒有跨數據庫連接的概念,此時鏈接服務器並不是Azure中的概念。
  • SQL Azure是共享環境,因爲沒有Windows登錄的概念。
  • 因爲他們在TempDB上創建壓力,所以總是會在需要後刪除TempDB對象。
  • 在降壓插入期間,使用batchsize選項來限制要插入的行數。這將限制事務日誌空間的使用。
  • 避免不必要地使用分組或阻止ORDER的操作,因爲它們導致高端內存使用量。
+0

從一個解決方案:http://stackoverflow.com/a/34877208/1151741 – Nigrimmist 2016-01-19 12:52:09

回答

2

使用#前綴(例如)創建表格。 create table #itemsearch然後使用insert into。臨時表的範圍僅限於會話,所以不存在併發問題。

+0

創建表是同樣喜歡臨時表?它安全嗎? – 2013-03-12 11:40:08

+1

當您創建表來告訴服務器它是臨時表時,您需要使用'#'前綴。例如。 '創建表#itemsearch'。不過,完成任務後放棄桌面是個很好的習慣。如果你創建一個沒有'#'的表,你可能會遇到併發問題。 – 2013-03-12 11:43:16

+0

列號不是靜態的,它根據條件而變化。我正在使用動態查詢。我更新了我的問題。在這種情況下,我該如何使用動態列和INSERT語句構建表? – 2013-03-13 05:33:33

7

SELECT INTO是您不幸在SQL Azure中無法執行的許多事情之一。

你必須做的是首先創建臨時表,然後執行插入。喜歡的東西:

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

從我引用的博客'SQL Azure要求所有表都具有聚簇索引,因此SELECT INTO語句會創建一個表並且不支持創建聚簇索引'。在這種情況下,我需要創建一個主鍵。需要嗎? – 2013-03-12 11:45:06

+0

是否有SQL Azure的不幸項目列表?這對我有幫助。所以我可以避免錯誤在開始本身 – 2013-03-12 11:47:27

+1

@Murali在臨時表的情況下,這是不需要的。至於那個列表,你可以在這裏找到它http://msdn.microsoft.com/en-us/library/windowsazure/ee336253.aspx – mattytommo 2013-03-12 11:49:56

-1

好了,大家都知道SQL Azure的表必須有一個聚集索引,這就是爲什麼在另一臺SELECT INTO失敗複製數據從一個表。 如果要遷移,必須首先創建一個具有相同結構的表,然後執行INSERT INTO語句。 對於臨時表格#你不需要創建索引。

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