SQL Azure不支持“select into” - 还有其他方法吗?

时间:2013-09-15 23:07:54

标签: sql tsql azure azure-sql-database

我有一个非常复杂的表格,我想在进行一些更改时暂时备份。通常,我只是做以下事情:

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

不幸的是我使用的是Azure,但似乎不支持:

  

Msg 40510,Level 16,State 1,Line 2声明'SELECT INTO'不是   在此版本的SQL Server中受支持。

有没有办法在功能中重新创建此功能?我可以通过编写表格,创建它然后使用select语句插入数据来做到这一点,但考虑到我使用Azure的频率,以及我需要在这个区域中处理多少个数据库,这是非常笨拙的。

6 个答案:

答案 0 :(得分:8)

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可用,Microsoft当然只建议使用测试数据库进行升级。

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

不幸的是,它无法完成。以下是我如何解决这个问题:

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

答案 3 :(得分:0)

INSERT INTO temp_User
SELECT * FROM dbo.[User] 

您可以尝试以上方法。它基本上是一个应用于插入语句的选择

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

答案 4 :(得分:0)

让我们假设您有一个包含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行。

答案 5 :(得分:0)

如上所述 - 您需要使用选择创建表格重写您的查询,例如

这是我的样本。是:

        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