此版本的SQL Server - SQL Azure不支持语句'SELECT INTO'

时间:2013-03-12 11:32:47

标签: sql sql-server azure-sql-database

我正在

  

此版本的SQL Server不支持语句“SELECT INTO”   在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 +@sqlInto +@sqlFrom 

EXEC sp_executesql @sql,@params

我有大约50,000条记录,因此决定使用Temp Table。但惊讶地发现这个错误。

我如何在SQL Azure中实现相同的目标?

编辑:阅读此博客http://blogs.msdn.com/b/sqlazure/archive/2010/05/04/10007212.aspx,建议我们在存储过程中创建一个表来存储数据而不是Temp表。在并发下安全吗?它会达到性能吗?

http://blog.sqlauthority.com/2011/05/28/sql-server-a-quick-notes-on-sql-azure/

添加一些积分
  • 每个表必须具有聚簇索引。不支持没有聚簇索引的表。
  • 每个连接都可以使用单个数据库。不支持单个事务中的多个数据库。
  • 'USE DATABASE'不能在Azure中使用。
  • 不支持全局临时表(或临时对象)。
  • 由于没有跨数据库连接的概念,目前链接服务器不是Azure中的概念。
  • SQL Azure是共享环境,因为没有Windows登录的概念。
  • 在TempDB上创建压力时,总是在需要之后删除TempDB对象。
  • 在buck插入期间,使用batchsize选项限制要插入的行数。这将限制事务日志空间的使用。
  • 避免不必要地使用分组或阻止ORDER操作,因为它们会导致高端内存使用。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:5)

新的Azure DB Update preview已解决此问题:

  

V12预览使您可以创建没有群集的表   指数。此功能对于支持T-SQL特别有用   SELECT ... INTO语句,它根据查询结果创建表。

http://azure.microsoft.com/en-us/documentation/articles/sql-database-preview-whats-new/

答案 2 :(得分:2)

使用#前缀创建表格,例如create table #itemsearch然后使用insert into。临时表的范围仅限于会话,因此不会出现并发问题。

答案 3 :(得分:-1)

好吧,我们都知道SQL Azure表必须有一个聚簇索引,这就是SELECT INTO将数据从一个表复制到另一个表失败的原因。 如果要迁移,则必须首先创建具有相同结构的表,然后执行INSERT INTO语句。 对于后跟#的临时表,您不需要创建索引。

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