我想使用select into语法创建e临时表。喜欢:
select top 0 * into #AffectedRecord from MyTable
Mytable有一个主键。当我使用merge插入记录时,语法主键是一个问题。我怎么能从临时表中删除pk约束
答案 0 :(得分:0)
“SELECT TOP(0)INTO ..”技巧很聪明,但我的建议是自己编写表格,原因就像这样。另一方面,当您实际引入数据时,SELECT INTO通常比创建表和执行插入更快。特别是在2014+系统上。
主键的存在与您的问题无关。从另一个表使用SELECT INTO时,不会创建键约束和索引,数据类型和NULLability都可以。请考虑以下代码并注意我的评论:
USE tempdb -- a good place for testing on non-prod servers.
GO
IF OBJECT_ID('dbo.t1') IS NOT NULL DROP TABLE dbo.t1;
IF OBJECT_ID('dbo.t2') IS NOT NULL DROP TABLE dbo.t2;
GO
CREATE TABLE dbo.t1
(
id int identity primary key clustered,
col1 varchar(10) NOT NULL,
col2 int NULL
);
GO
INSERT dbo.t1(col1) VALUES ('a'),('b');
SELECT TOP (0)
id, -- this create the column including the identity but NOT the primary key
CAST(id AS int) AS id2, -- this will create the column but it will be nullable. No identity
ISNULL(CAST(id AS int),0) AS id3, -- this this create the column and make it nullable. No identity.
col1,
col2
INTO dbo.t2
FROM t1;
这是我创建的新表的(为简洁而清理)DDL:
-- New table
CREATE TABLE dbo.t2
(
id int IDENTITY(1,1) NOT NULL,
id2 int NULL,
id3 int NOT NULL,
col1 varchar(10) NOT NULL,
col2 int NULL
);
请注意,主键已消失。当我带来id as-is时它保留了身份。 将id列强制转换为int(即使它已经是int)是我如何摆脱身份插入 。添加ISNULL是如何使列可以为空。
默认情况下,身份插入设置为off,此查询将失败: INSERT dbo.t2(id,id3,col1)VALUES(1,1,'x');
Msg 544, Level 16, State 1, Line 39
Cannot insert explicit value for identity column in table 't2' when IDENTITY_INSERT is set to OFF.
设置身份插入将解决问题:
SET IDENTITY_INSERT dbo.t2 ON;
INSERT dbo.t2 (id, id3, col1) VALUES (1, 1, 'x');
但是现在你必须为该列提供一个值。请注意这里的错误:
INSERT dbo.t2 (id3, col1) VALUES (1, 'x');
Msg 545, Level 16, State 1, Line 51
Explicit value must be specified for identity column in table 't2' either when IDENTITY_INSERT is set to ON
希望这会有所帮助。
侧面说明:这是一种很好的方式来解决选择插入的工作原理。我使用了烫发表,因为它更容易找到。