sql-server – T-SQL通过存储过程选择,操作和重新插入

简短版本是我试图从平面表映射到具有存储过程的新表集.

长版本:我想从现有表中SELECT记录,然后为每个记录插入一组新表(大多数列将进入一个表,但有些将转到其他表并与这个新表相关) .

我对存储过程和T-SQL有点新意.我无法在这个问题上找到任何特别明确的内容.

看起来我想要的东西是这样的

INSERT INTO [dbo].[MyNewTable] (col1, col2, col3)
    SELECT
        OldCol1, OldCol2, OldCol3 
    FROM 
        [dbo].[MyOldTable] 

但我不确定如何保存相关记录,因为我将它分成多个表.我还需要在旧列适合新列之前操作旧列中的一些数据.

谢谢

示例数据

MyOldTable

Id  | Year | Make | Model   | Customer Name
572 | 2001 | Ford | Focus   | Bobby Smith
782 | 2015 | Ford | Mustang | Bobby Smith

进入(无需担心重复客户或保留旧ID):

MyNewCarTable

Id | Year | Make | Model
1  | 2001 | Ford | Focus 
2  | 2015 | Ford | Mustang

MyNewCustomerTable

Id | FirstName | LastName | CarId
1  | Bobby     | Smith    | 1
2  | Bobby     | Smith    | 2

最佳答案 我会说你有OldTable Id保存在新表中,直到你处理数据.

我假设您在MyNewCarTable上创建了一个Identity列标识

INSERT INTO MyNewCarTable (OldId, Year, Make, Model)
SELECT Id, Year, Make, Model FROM MyOldTable

然后,加入新表和上表以插入到第二个表中.我假设你的MyNewCustomerTable也有启用了Identity的Id列.

INSERT INTO MyNewCustomerTable (CustomerName, CarId)
SELECT CustomerName, new.Id 
FROM MyOldTable old
JOIN MyNewCarTable new ON old.Id = new.OldId

Note: I have not applied Split of Customer Name to First Name and
Last Name as I was unsure about existing data.

如果您不想在MyNewCarTable中使用OldId,则可以删除它

ALTER TABLE MyNewCarTable DROP COLUMN OldId
点赞