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

Mur*_*san 8 sql sql-server azure-sql-database

我正进入(状态

SQL Server中此版本的SQL Server不支持语句"SELECT INTO"

对于存储过程中的以下查询

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
Run Code Online (Sandbox Code Playgroud)

我有大约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,因为它们会导致高端内存使用.

mat*_*mmo 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
Run Code Online (Sandbox Code Playgroud)


小智 5

新的Azure数据库更新预览已解决此问题:

V12预览使您可以创建没有聚簇索引的表.此功能特别有助于它支持T-SQL SELECT ... INTO语句,该语句根据查询结果创建表.

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


Dav*_* S. 2

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