C# 如何加载外键列

C# 如何加载外键列,c#,sql,ssis,foreign-key-relationship,C#,Sql,Ssis,Foreign Key Relationship,好了伙计们这就是我所经历的, 我有一个名为[dbo].[FileMetaData]的父表和一个名为[dbo].[Ref_FileType]的子表 它是对父表的引用。在子表中,我只有两列,TypeId whis在父表和TypeDescription中是FK 我想在父表[dbo].[FileMetaData]中弹出TypeId列,下面是如何在子表中获得typeDescription的 INSERT into [test].[dbo].[Ref_FileType] (TypeDescription)

好了伙计们这就是我所经历的, 我有一个名为[dbo].[FileMetaData]的父表和一个名为[dbo].[Ref_FileType]的子表 它是对父表的引用。在子表中,我只有两列,TypeId whis在父表和TypeDescription中是FK 我想在父表[dbo].[FileMetaData]中弹出TypeId列,下面是如何在子表中获得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].[Ref_FileType]中的
TypeId
对父表
[dbo].[FileMetaData]
进行popluate,并将其分配给子表[Ref_FileType] 我从上面的insert语句中得到了
TypeDescription
。因此,我想要的是根据文件名中最后4个字符插入,例如
DataValidationRules.xlsx.

如果您选中它,它是一个
FileMetaData
,那么如果它
Fileaname
xlsx结尾。
我想用
1
填充该文件的所有
typeID
,如果它以
txt=2
结尾,e.t.c

请给出明确的答复


谢谢。

根据您的描述,我假设您的表结构如下:

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:

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 Fiddle:

如何将
[dbo].[Fileinformation]
[dbo].[FileMetaData]
或子表联系起来?我说得对吗,您只想根据文件扩展名为每个
FileMetaData
设置
类型ID?@outcoldman是的,这正是我想做的。@Praveen,我刚刚编辑了这个问题,我在dbo.fileInformation中犯了一个错误。我不理解你的设计。我本以为表'Ref_FileType'应该是引用表,表'FileMetaData'应该是引用表,FK为'Ref_FileType'。@user2183502我更新了我的答案,因为当有两个或更多具有相同扩展名的文件时,它会导致错误。还修改为处理不同长度的扩展。如果我已经回答了你的问题,请将我的回答标记为已接受。谢谢。还有什么方法可以提取文件扩展名,我以前使用的逻辑似乎不太好,我尝试用最后一个句点分割文件名以获得正确的文件扩展名,你能帮我吗?Thanks@user2183502见上面我的答案。它查找最后一个句点并提取句点右侧的所有字符作为扩展名。但是,对于没有扩展名的文件名,它将失败(请参阅此处了解如何修复它:)。@Diamond,我有这个问题,您能帮我解决吗?在执行此任务时,我使用以下trim语句填充不同的表示例是从[test].[dbo].[FileMetadata]中选择不同的rtrim(右(FilePath,charindex('\',reverse(FilePath))-1))s提取表中\之后的最后一个字符串现在我需要提取的字符串是此列中的ABC\\doc\dfs\SCPD\Metadata\Metadata\u Creation\u Process\Members\ABC\SELL如何处理?感谢您的帮助?。@user2183502为了帮助您更快地得到答案(对不起,我现在很忙),请将此作为另一个问题发布,并链接到此问题。其他用户也可以帮助你!