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

时间:2016-09-22 14:57:09

标签: sql-server tsql dictionary

简短版本是我尝试使用存储过程从平面表映射到新的表集。

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

我对存储过程和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

3 个答案:

答案 0 :(得分:2)

我会说你有OldTable ID保留在新表中,直到你处理数据。

我假设您在Identity

上创建了IdMyNewCarTable
INSERT INTO MyNewCarTable (OldId, Year, Make, Model)
SELECT Id, Year, Make, Model FROM MyOldTable

然后,加入新表和上表以插入第二个表。我假设您的MyNewCustomerTable也有Id列,其中Identity已启用。

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

注意:我没有将客户名称拆分应用于名字和   姓氏,因为我不确定现有数据。

如果您不想OldId MyNewCarTableDELETE可以ALTER TABLE MyNewCarTable DROP COLUMN OldId

@ndb.transactional(xg=True)
def post():
    try:
        model1 = Model1()
        model1.key1 = 'key1'
        model1.key2 = 'key2'
        model1.put()

        ...

        #some logic3 block goes here
        .
        .
    except Exception:
        #all the database insertion transaction which happened should be rollback here.
        raise ndb.Rollback

答案 1 :(得分:1)

您错过了规范化的一个步骤。您无需复制每辆车的客户信息。第4范式表格需要三个表格。这将减少存储空间,更重要的是允许在一个位置更新客户数据。

<强>客户 顾客ID 名字 名字

<强>汽车 CarID 使 模型 年

<强> CustomerCar CustomerCarID CarID 顾客ID DatePurchaed

通过这种方式,每辆车可以拥有多个车主,每个车主可以拥有多辆车,每辆车和/或客户只需要更新一条记录......第四范式。

答案 2 :(得分:-1)

如果我正确读取此内容,您希望从表1中获取每一行,并使用某些行数据创建表A中的新记录,然后将同一原始行中的数据创建到表B,表C但是再次参考表A?

如果是这种情况,您将使用Identity创建TableA并将其设为PK。

将所需的列数据插入该表并使用@IDENTITY检索最后一个标识值,然后将原始表中的剩余数据插入其他表,TableB,TableC等,并使用您的身份从TableA中检索为其他表中的FK。

通过示例:

表1列有col1,col2,col3,col4,col5 表A具有TabAID,col1,col2 表B具有TabBID,TabAID,col3 TableC具有TabCID,TabAID,col4

当读取第一行时,col1&amp;的值为col2插入TableA。 从插入的那一行捕获标识,然后将col3的值和标识输入到TableB中,然后将col4的值和标识输入到TableC中。

这是用于规范化数据的标准数据迁移技术。

希望这有助于,