"병합"에 문제가 있습니다. MERGE 문에서 동일한 행을 두 번 이상 UPDATE 또는 DELETE하려고했습니다. 병합 문이 여러 번 같은 행 이상을 업데이트하거나 업데이트하고 삭제할 수 없습니다 제한이 있습니다대량 주입 Sproc에서 MERGE 문제
ALTER PROCEDURE [Files].[ImportFiles]
AS
-- Create a temporary table for the bulk import
CREATE TABLE #TempImportFileTable(
[fileID] [bigint] IDENTITY(1,1) NOT NULL,
[FileName] [nvarchar](max) NULL,
[FilePath] [nvarchar](max) NULL,
[FullPath] [nvarchar](max) NULL,
[FileSize] [nvarchar](max) NULL,
[FileExtension] [nvarchar](max) NULL,
[FileCreated] [nvarchar](max) NULL,
[FileLastAccessed] [nvarchar](max) NULL,
[FileModified] [nvarchar](max) NULL
CONSTRAINT [PK_fileID1] PRIMARY KEY CLUSTERED
(
[fileID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY];
-- Import into the temp table
BULK INSERT #TempImportFileTable FROM 'C:\Program Files\o7th FileSystem to DB\import.txt'
WITH(KEEPIDENTITY, FIELDTERMINATOR =',', ROWTERMINATOR = '\n');
-- Delete the Duplicate entries
DELETE FROM #TempImportFileTable WHERE fileID NOT IN (SELECT MAX(fileID) FROM #TempImportFileTable GROUP BY FullPath);
-- Now Merge the 2 tables
MERGE [Files].[File] AS TargetTable
USING #TempImportFileTable AS SourceTable
ON (TargetTable.FullPath = SourceTable.FullPath)
WHEN NOT MATCHED BY TARGET
THEN INSERT (FileName, FilePath, FileSize, FileExtension, FileCreated, FileLastAccessed, FileModified)
VALUES(SourceTable.FileName, SourceTable.FilePath, SourceTable.FileSize, SourceTable.FileExtension, SourceTable.FileCreated, SourceTable.FileLastAccessed, SourceTable.FileModified)
WHEN MATCHED
THEN UPDATE SET
TargetTable.FileName = SourceTable.FileName,
TargetTable.FilePath = SourceTable.FilePath,
TargetTable.FileSize = SourceTable.FileSize,
TargetTable.FileExtension = SourceTable.FileExtension,
TargetTable.FileCreated = SourceTable.FileCreated,
TargetTable.FileLastAccessed = SourceTable.FileLastAccessed,
TargetTable.FileModified = SourceTable.FileModified;
데이터 파일에 중복 된 항목이 있습니까? – podiluska
"MERGE 문이 동일한 행을 두 번 이상 UPDATE 또는 DELETE하려고했습니다." 이것이 의미하는 바는 #TempFileTable의 한 행 이상이 [Files]. [File]의 한 행과 일치한다는 것입니다. Merge 문은 [Files]. [File]을 업데이트하는 데 사용할 행을 알지 못하므로 오류를 반환합니다. FileName이 아닌 고유 한 항목에 대해 일치를 시도 할 수 있습니다. 그런데 fileName 필드가 nullable 인 것 같습니다. 그래서 일치 조건을 (ISNULL (TargetTable.FileName, '') = ISNULL (SourceTable.FileName, ''))로 대체 할 수 있습니다. –
파일이 이미 테이블에 존재하는지 확인하기 위해 FileName을 일치시킬 수 있어야합니다. – Kevin