如何加载外键列

时间:2013-04-30 05:37:18

标签: c# sql ssis foreign-key-relationship

好的家伙是我经历的, 我有一个名为[dbo]的父表。[FileMetaData]和一个名为[dbo]的子表。[Ref_FileType] 这是对父表的引用。在子表中我只有两列,TypeId在Parent表中是FK,TypeDescription 我想在父表[dbo]中弹出TypeId列。[FileMetaData],这里是如何获得子表中的typeDescription

INSERT into [test].[dbo].[Ref_FileType] (TypeDescription)
( select Distinct RIGHT(s.FileName,4) from [test].[dbo].[FileMetadata]s  
WHERE NOT EXISTS (SELECT * FROM [test].[dbo].[Ref_FileType] ))

示例是

TypeID | Type Descritption
    1        xlsx
    2        txt
    3        TCF

现在我想在子表[dbo]中弹出父表[dbo].[FileMetaData]并分配TypeId。[Ref_FileType]也注意到   我从上面的insert语句中获得了TypeDescription。所以我想要的是根据文件名中的最后4个字符插入,例如  DataValidationRules.xlsx.

如果您检查它是FileMetaData,那么如果Fileanamexlsx.结尾,我想用typeID填充此类文件的所有1 ,如果它以txt =2等结尾

请妥善回答。

感谢。

1 个答案:

答案 0 :(得分:0)

根据您的描述,我假设您的表结构类似于:

CREATE TABLE FileMetaData
(
  FileName varchar(256) NOT NULL,
  FileTypeId int NULL
);

CREATE TABLE Ref_FileType
(
  TypeId int NOT NULL IDENTITY,
  Description varchar(4) NOT NULL
)

表格中填充了一些数据:

INSERT INTO FileMetaData VALUES ('DataValidationRules.xlsx', NULL);
INSERT INTO FileMetaData VALUES ('Readme.txt', NULL);
INSERT INTO FileMetaData VALUES ('SomeFile.TCF', NULL);

您可以使用以下语句提取文件扩展名,使用可变长度扩展名int account:

WITH temp (Description) AS
(
  SELECT DISTINCT SUBSTRING(FileName, StartPosition, LEN(FileName) - StartPosition + 2)
  FROM
  (
    SELECT FileName, LEN(FileName) - CHARINDEX('.', REVERSE(FileName)) + 2 AS StartPosition
    FROM FileMetadata
  ) T1
)
INSERT INTO Ref_FileType (Description)
SELECT T1.Description
FROM temp T1
LEFT JOIN  Ref_FileType T2 ON T2.Description = T1.Description
WHERE T2.TypeId IS NULL;

下一步是将FileMetaData表中的每一行与正确的文件类型相关联:

UPDATE T1
SET FileTypeId = T2.TypeId
FROM FileMetaData T1
JOIN Ref_FileType T2 ON T2.Description = SUBSTRING(FileName, LEN(FileName) - LEN(T2.Description) +1 , LEN(T2.Description));

希望这有帮助。

SQL小提琴:http://sqlfiddle.com/#!3/50f0d/5