8

我正进入(状态

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

我有大约 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/的观点

  • 每个表都必须有聚集索引。不支持没有聚集索引的表。
  • 每个连接都可以使用单个数据库。不支持单个事务中的多个数据库。
  • “使用数据库”不能在 Azure 中使用。
  • 不支持全局临时表(或临时对象)。
  • 由于没有跨数据库连接的概念,所以目前Azure中还没有链接服务器的概念。
  • SQL Azure 是共享环境,因此没有 Windows 登录的概念。
  • 始终在需要后删除 TempDB 对象,因为它们会对 TempDB 造成压力。
  • 在降压插入期间,使用 batchsize 选项来限制要插入的行数。这将限制事务日志空间的使用。
  • 避免不必要地使用分组或阻塞 ORDER 操作,因为它们会导致高端内存使用。
4

4 回答 4

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
于 2013-03-12T11:42:54.417 回答
5

新的Azure DB 更新预览解决了这个问题:

V12 预览版使您能够创建没有聚集索引的表。此功能特别有助于支持从查询结果创建表的 T-SQL SELECT...INTO 语句。

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

于 2015-01-14T01:10:09.583 回答
2

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

于 2013-03-12T11:39:11.230 回答
-1

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

如何创建索引以及如何为临时表执行插入?

于 2015-08-01T06:40:45.397 回答