2013-04-30 56 views
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 

現在我想popluate父表[dbo].[FileMetaData]與和子表[DBO]分配TypeId。[Ref_FileType]還指出, 我得到了TypeDescription從上面的插入語句。所以,我要的是要插入基於過去的4個字符的文件名,例如 DataValidationRules.xlsx.

如果你選擇了它是一個FileMetaData,所以如果Fileanamexlsx.結束我想填充所有typeID這樣如果以txt =2結尾,則爲1,等

請給出明確的答案。

謝謝。

+0

如何'[DBO] [Fileinformation]'與相關'[DBO] [FileMetaData]'或與子表。? – praveen 2013-04-30 05:46:06

+0

我是對的,你只是想根據文件擴展名爲每個'FileMetaData'設置'TypeId'? – outcoldman 2013-04-30 06:54:48

+0

@ outcoldman是的你是對的,這正是我想要做的。 – user2183502 2013-04-30 12:22:43

回答

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

+0

謝謝@ƉiamondǤeezeƦ,它運行良好..我appreaciate .. – user2183502 2013-04-30 13:41:33

+0

@ user2183502我更新了我的答案,因爲它有兩個或多個文件具有相同的擴展名時導致錯誤。還修改了處理不同長度的擴展。如果我回答了您的問題,請將我的答案標記爲已接受。謝謝。 – 2013-04-30 13:44:30

+0

什麼其他方式我可以提取文件擴展名,我以前使用的邏輯似乎不工作太好,我試圖分裂文件名與上期間得到一個正確的文件擴展名,你能幫助嗎?謝謝 – user2183502 2013-05-01 03:51:07