Jus*_*sel 9 sql t-sql sql-server-2008
我一直在研究一个项目,并在使用SELECT INTO时遇到了一些有趣的行为.如果我有一个定义为列的表int identity(1,1) not null并使用SELECT INTO复制它,则新表将保留IDENTITY属性,除非涉及到连接.如果存在连接,则新表上的相同列被简单地定义为int not null.
这是一个可以运行以重现行为的脚本:
CREATE TABLE People (Id INT IDENTITY(1,1) not null, Name VARCHAR(10))
CREATE TABLE ReverseNames (Name varchar(10), ReverseName varchar(10))
INSERT INTO People (Name)
VALUES ('John'), ('Jamie'), ('Joe'), ('Jenna')
INSERT INTO ReverseNames (Name, ReverseName)
VALUES ('John','nhoJ'), ('Jamie','eimaJ'), ('Joe','eoJ'), ('Jenna','anneJ')
--------
SELECT Id, Name
INTO People_ExactCopy
FROM People
SELECT Id, ReverseName as Name
INTO People_WithJoin
FROM People
JOIN ReverseNames
ON People.Name = ReverseNames.Name
SELECT Id, (SELECT ReverseName FROM ReverseNames WHERE Name = People.Name) as Name
INTO People_WithSubSelect
FROM People
--------
SELECT OBJECT_NAME(c.object_id) as [Table],
c.is_identity as [Id Column Retained Identity]
FROM sys.columns c
where
OBJECT_NAME(c.object_id) IN ('People_ExactCopy','People_WithJoin','People_WithSubSelect')
AND c.name = 'Id'
--------
DROP TABLE People
DROP TABLE People_ExactCopy
DROP TABLE People_WithJoin
DROP TABLE People_WithSubSelect
DROP TABLE ReverseNames
Run Code Online (Sandbox Code Playgroud)
我注意到WithJoin和WithSubSelect查询的执行计划都包含一个连接运算符.如果我们处理更多的行,我不确定是否会在性能方面表现更好.
任何人都可以对此有所了解并告诉我是否有办法利用SELECT INTO加入并仍然保留IDENTITY属性?
来自微软:
将现有标识列选择到新表时,新列将继承IDENTITY属性,除非满足下列条件之一:
Run Code Online (Sandbox Code Playgroud)The SELECT statement contains a join, GROUP BY clause, or aggregate function. Multiple SELECT statements are joined by using UNION. The identity column is listed more than one time in the select list. The identity column is part of an expression. The identity column is from a remote data source.如果这些条件中的任何一个为真,则列创建为NOT NULL而不是继承IDENTITY属性.如果新表中需要标识列但是此列不可用,或者您希望种子或增量值与源标识列不同,请使用IDENTITY函数在选择列表中定义列.
您可以IDENTITY按照他们的建议使用该功能并省略该IDENTITY列,但随后您将丢失这些值,因为该IDENTITY函数将生成新值,并且我认为这些值很容易确定,即使使用ORDER BY.
| 归档时间: |
|
| 查看次数: |
9158 次 |
| 最近记录: |