通过使用xp_dirtree并通过做一些工作我能够将所有图像放入临时表中,现在我必须将其插入到具有标识列ImageID的主表中,同时我必须附加相同的imageid开始添加' _'的图像文件名称原始文件名
正在使用类似插入主表的查询
insert into tblImage(ImagePath)
SELECT fullpath + '\' + subdirectory
FROM #Directory ORDER BY fullpath,subdirectory;
目前正在使用c#dot net中的循环来执行此操作....插入一个图像获取图像ID(scope_identity)并将其附加到文件名。
但随着图像数量的增加需要花费大量时间。
有没有更好的方法在sql server中完成此任务。
答案 0 :(得分:0)
假设在插入之后,tblImage中的数据看起来像这样?
ImageID ImagePath
1 somefilename.jpg
2 someotherfilename.jpg
标识值仅在插入后可用,因此您可以在初始批量插入后进行批量更新。插入过程中无法使用标识值。
UPDATE tblImage SET
ImagePage = CONVERT(VARCHAR(10), ImageId) + ImagePath
WHERE (You'll have to specify a where clause to limit the update to the newly created records)
或者您可以将第3列添加到tblImage
UPDATE tblImage SET
NewFileName = CONVERT(VARCHAR(10), ImageId) + '_' + ImagePath
WHERE NewFileName IS NULL
如果您需要更改磁盘上的文件名,我可以考虑两种可能的解决方案。
实现的第一个也是最快的,就是使用xp_cmdshell执行重命名语句。 (这假设ImagePage具有原始文件名,NewFileName具有新文件名。)
DECLARE @Cmd NVARCHAR(MAX) = '';
SELECT @Cmd = @Cmd + 'EXEC xp_cmdshell ''rename "' + ImagePath + '" "' + NewFileName + '"''
'
FROM tblImage
EXEC (@CMD);
要使用xp_cmdshell,首先需要启用,因为默认情况下已禁用。
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
重命名磁盘上文件的第二个选项是在SQL Server中设置一个FileTable,指向包含要重命名的文件的目录。然后重命名文件成为一个简单的更新语句。
您可以阅读有关FileTables here
的更多信息还有一些关于设置FileTables的非常全面的演练。
希望有所帮助。