我有一个非常复杂的表格,我想在进行一些更改时暂时备份。通常,我只是做以下事情:
SELECT *
INTO temp_User
FROM dbo.[User] AS u
不幸的是我使用的是Azure,但似乎不支持:
Msg 40510,Level 16,State 1,Line 2声明'SELECT INTO'不是 在此版本的SQL Server中受支持。
有没有办法在功能中重新创建此功能?我可以通过编写表格,创建它然后使用select语句插入数据来做到这一点,但考虑到我使用Azure的频率,以及我需要在这个区域中处理多少个数据库,这是非常笨拙的。
答案 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)
不幸的是,它无法完成。以下是我如何解决这个问题:
答案 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