首页 > 解决方案 > 如何在执行 INSERT INTO 时在 SELECT 语句期间创建数据?

问题描述

对不起,如果这个问题令人困惑,但我不确定如何确切地问它。基本上我有一个有 20 列和数百万行的巨型表。我想将这些行和列的子集插入到另一个表中,然后还为这些行中的每一行在表中创建一个新时间和新 GUID。例如,假设我有下表:

CREATE TABLE [dbo].[AddressData](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [AddressDataGUID] [uniqueidentifier] ROWGUIDCOL NOT NULL,
    [City] [varchar](32) NOT NULL,
    [State] [varchar](2) NOT NULL,
    [DateModified] [datetime2](7) NOT NULL,
    [TS] [timestamp] NOT NULL,
 CONSTRAINT [PK_AddressData_ID] PRIMARY KEY CLUSTERED [ID]

现在我还有另一个包含 City 和 State 的表,但它还有一堆其他列,例如 Street、Zip 等。我想从更大的表中选择每对不同的 City 和 State 并将它们粘贴到新表,我还希望它将 DateModified 设置为当前时间,并为每个不同的对创建一个新的随机 GUID。我无法弄清楚如何在 sql server 中执行此操作。我尝试了以下方法:

INSERT INTO Community (CommunityGUID, City, [State], DateModified)
VALUES (NEWID(), t.City, t.[State], SYSUTCDATETIME())
SELECT DISTINCT City, [State] FROM FullTable t

但是,我无法弄清楚正确的语法。我可以通过创建一个包含所有可空字段的临时表来解决这个问题,用这两个列选择不同的列,然后逐行循环创建所有这些值,然后最后将完全构造的表选择到另一个表中. 我几乎很想这样做,因为这是我作为软件开发人员而不是数据库开发人员的第一直觉,但是如果有一种方法可以在一个语句中做到这一点并让数据库引擎对其进行优化。

标签: sqlsql-server

解决方案


我想你只是想要一个真正的查询INSERT

INSERT INTO Community (CommunityGUID, City, [State], DateModified)
    SELECT NEWID(), t.City, t.[State], SYSUTCDATETIME()
    FROM (SELECT DISTINCT City, [State]
          FROM FullTable t
         ) t;

推荐阅读