【问题标题】:SQL Azure doesn't support 'select into' - Is there another way?SQL Azure 不支持“选择进入” - 还有其他方法吗?
【发布时间】:2013-09-20 00:50:17
【问题描述】:

我有一个非常复杂的表,我想在进行一些更改时对其进行临时备份。通常,我会执行以下操作:

SELECT  *
INTO    temp_User
FROM    dbo.[User] AS u

很遗憾,我使用的是 Azure,似乎不支持此功能:

消息 40510,级别 16,状态 1,行 2 语句 'SELECT INTO' 不是 此版本的 SQL Server 支持。

有没有办法将此功能重新创建为函数?我可以通过编写表格脚本、创建表格然后使用 select 语句插入数据来做到这一点,但考虑到我使用 Azure 的频率,以及我需要在该领域工作的数据库数量,这非常笨拙。

【问题讨论】:

标签: sql tsql azure azure-sql-database


【解决方案1】:
INSERT INTO temp_User
SELECT * FROM dbo.[User] 

你可以试试上面的。它基本上是一个应用于插入语句的选择

http://blog.sqlauthority.com/2011/08/10/sql-server-use-insert-into-select-instead-of-cursor/

【讨论】:

  • 语法不正确?我不认为你的意思是插入?
【解决方案2】:

Azure 要求所有表都有聚集索引,因此不支持 SELECT INTO

你必须:

CREATE TABLE temp_User () --fill in table structure
INSERT INTO temp_User
SELECT *
FROM dbo.[User]

要轻松编写表格脚本,您可以自己编写或使用此问题的答案之一:

Script CREATE Table SQL Server

更新: 正如 Jordan B 所指出的,V12 将包括对堆的支持(无聚集索引要求),这意味着 SELECT INTO 将起作用。目前 V12 Preview 可用,微软当然只推荐使用测试数据库进行升级。

【讨论】:

  • 当然,我理解这一点,并在我原来的问题中提到过——但是有没有办法重新创建这个过程(也许使用系统表?)
【解决方案3】:

不幸的是,它无法完成。以下是我的解决方法:

  1. 打开 SQL Server Management Studio
  2. 右击表格
  3. 选择脚本为...创建表
  4. 编辑生成的脚本,将表名更改为您在查询中指定的名称
  5. 执行查询

【讨论】:

    【解决方案4】:

    新的Azure DB Update preview 解决了这个问题:

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

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

    【讨论】:

      【解决方案5】:

      假设您有一个带有 Id、Column1 和 Column2 的表。那么这可能是您的解决方案

      CREATE TABLE YourTableName_TMP ....
      GO
      SET IDENTITY_INSERT YourTableName_TMP ON 
      GO
      INSERT INTO YourTableName_TMP
      ([Id] ,[Column1] ,[Column2])      
      SELECT [Id] ,[Column1] ,[Column2]
      FROM 
      (
          SELECT * 
          FROM
          (
              SELECT  [Id] ,[Column1] ,[Column2] ROW_NUMBER() OVER(ORDER BY ID DESC) AS RowNum
              FROM YourTableName
          )
          WHERE RowNum BETWEEN 0 AND 500000
      )
      GO
      SET IDENTITY_INSERT YourTableName_TMP OFF
      GO
      

      首先创建一个临时表,然后插入行窗口化。这是一团糟,我知道。我的经验是,从客户端使用 SQL Server Management Studio 执行此操作每分钟大约会产生 200.000 行。

      【讨论】:

        【解决方案6】:

        如上所述 - 您需要将查询从使用 select into 重写为 create table like

        这是我的样本。是:

                select  emrID, displayName --select into
                into #tTable
                from emrs
        
                declare @emrid int
                declare @counter int = 1
                declare @displayName nvarchar(max)
        
                while exists (select * from #tTable)
                begin
                    -- some business logic
                    select top 1  @displayName = displayname
                    from #tTable
                    group by displayname
                    update emrs  set groupId = @counter where @displayName = displayname    
                    delete #tTable
                    where @displayName = displayname
                    set @counter = @counter + 1 
                end
                drop table #tTable
        

        修改:

                CREATE TABLE #tTable ([displayName] nvarchar(max)) --create table
                INSERT INTO #tTable -- insert to next select  :
        
                select  displayName            
                from emrs
        
                declare @emrid int
                declare @counter int = 1
                declare @displayName nvarchar(max)
        
                while exists (select * from #tTable)
                begin
                    -- some business logic
                    select top 1  @displayName = t.displayName
                    from #tTable as t
                    group by t.displayname
                    update emrs  set groupId = @counter where @displayName = displayname    
                    delete #tTable
                    where @displayName = displayname
                    set @counter = @counter + 1 
                end
                drop table #tTable
        

        不要忘记删除您的临时表。 此外,您可以在此处找到带有描述的更简单示例: http://www.dnnsoftware.com/wiki/statement-select-into-is-not-supported-in-this-version-of-sql-server

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-22
          • 2011-04-21
          • 1970-01-01
          • 2023-02-20
          相关资源
          最近更新 更多