2013-03-12 27 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?