0

[dbo].[FileMetaData] という親テーブルと、親テーブルへの参照である [dbo].[Ref_FileType] という子テーブルがあります。子テーブルには、親テーブルの FK である TypeId と TypeDescription の 2 つの列しかありません。親テーブル [dbo].[FileMetaData] の TypeId 列に入力します。

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]割り当てたいと思います。また、上記の挿入ステートメントから取得したことに注意してください。だから私が欲しいのは、ファイル名の最後の4文字と例に基づいて挿入することです TypeIdTypeDescriptionDataValidationRules.xlsx.

それをチェックすると FileMetaData、なので、でFileaname終わる 場合は、そのようなファイルのxlsx.すべてに を入力したい、で終わる場合などtypeID1txt =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);

可変長拡張子 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 フィドル: http://sqlfiddle.com/#!3/50f0d/5

于 2013-04-30T12:58:54.143 に答える