0

好的,伙计们,这就是我所经历的,我有一个名为 [dbo].[FileMetaData] 的父表和一个名为 [dbo].[Ref_FileType] 的子表,它是对父表的引用。在子表中我只有两列,TypeId whis 是父表中的 FK 和 TypeDescription 我想填充父表 [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] 填充父表[dbo].[FileMetaData]并在子表中分配TypeId。还请注意,我TypeDescription从上面的插入语句中得到了。所以我想要的是根据文件名中的最后 4 个字符插入,例如 DataValidationRules.xlsx.

如果你检查它是一个 FileMetaData,所以如果它Fileanamexlsx.我想填充所有typeID此类文件1,如果它以txt =2等结尾

请给一个明确的答案。

谢谢。

4

1 回答 1

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);

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

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

于 2013-04-30T12:58:54.143 回答