2013-04-30 4 views
0

Хорошо, ребята, вот что я переживаю, У меня есть родительская таблица с именем [dbo]. [FileMetaData] и дочерняя таблица с именем [dbo]. [Ref_FileType] , которая является ссылкой на родительский стол. В дочерней таблице у меня есть только два столбца: TypeId whis - FK в родительской таблице и TypeDescription Я хочу посыпать столбец TypeId в родительской таблице [dbo]. [FileMetaData], вот как получается типDescription в дочернем таблицаКак загрузить колонку внешнего ключа

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] с и выделены TypeId в дочерней таблице [DBO]. [Ref_FileType] также отмечает, что я получил TypeDescription от вышеприведенное заявление. Так что я хочу, чтобы вставить на основе последних 4 полукокса в имени файла, и пример DataValidationRules.xlsx.

Если вы проверить это это FileMetaData, так что если он Fileaname заканчивается xlsx. Я хочу, чтобы заполнить все typeID для таких файл с 1, если он заканчивается txt =2 и т. д.

Просьба дать ясный ответ.

Спасибо.

+0

Как '[DBO] [Fileinformation]' связанные с '[DBO] [FileMetadata]' или дочерней таблице..? – praveen

+0

Я прав, что вы просто хотите установить 'TypeId' для каждой' FileMetaData' на основе расширения файла? – outcoldman

+0

@ outcoldman Да, вы правы, это именно то, что я хочу делать. – user2183502

ответ

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

+0

@ user2183502 Я обновил свой ответ, поскольку он вызвал ошибку, когда было два или более файлов с тем же расширением. Также изменен для обработки расширений разной длины. Если я отвечу на ваш вопрос, пожалуйста, отметьте мой ответ как принятый. Благодарю. –

+0

какой другой способ я могу извлечь расширения файлов. Логика, которую я использовал раньше, кажется, не работает слишком хорошо, я попытался разделить имя файла с последним периодом, чтобы получить правильное расширение файла. Можете ли вы помочь с этим? Спасибо – user2183502

Смежные вопросы