5

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

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

不幸的是,我使用的是 Azure,看来这不受支持:

此版本的 SQL Server 不支持消息 40510、级别 16、状态 1、第 2 行语句“SELECT INTO”。

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

4

6 回答 6

8

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

你必须:

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

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

脚本创建表 SQL Server

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

于 2013-09-15T23:12:57.120 回答
5

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

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

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

于 2015-01-13T22:14:30.947 回答
1

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

  1. 打开 SQL Server 管理工作室
  2. 右键单击表格
  3. 选择脚本为 ... 创建表
  4. 编辑生成的脚本以将表名更改为您在查询中指定的名称
  5. 执行您的查询
于 2014-03-31T02:41:09.650 回答
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/

于 2013-09-15T23:11:18.313 回答
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 行。

于 2015-01-31T23:03:11.313 回答
0

如上所述 - 您需要使用select into重写您的查询以创建类似的表

这是我的样本。曾是 :

        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

于 2016-01-19T12:46:45.673 回答