我有一個SQL服務器運行在我的Windows服務器上,並且在一個表的特定列上,我有一個Zip文件的路徑(它反過來又有數據庫中存儲的數據的來源)。其中一些無效(不匹配數據庫中的數據)。我需要讓SQL Server驗證這些Zip文件是否存在,並且它們與存儲zip文件的路徑和名稱的列匹配。這樣我將刪除錯誤的文件路徑列對應關係。如何使用SQL驗證Windows中是否存在文件?
回答
但是,您可以使用xp_fileexist請注意這是無證和不支持。
您可以使用SQLCLR,但是您並未指定您正在使用的SQL Server版本,因此它可能不相關 - 在任何情況下,默認情況下都會禁用它,並且安全策略會阻止其用於有一些地方。
您可以使用#temp表和xp_cmdshell,但是由於SQLCLR相同的原因,xp_cmdshell通常處於禁用狀態。根據新的要求
/* if you need to enable xp_cmdshell:
exec master..sp_configure 'show adv', 1;
reconfigure with override;
exec master..sp_configure 'xp_cmdshell', 1;
reconfigure with override;
exec master..sp_configure 'show adv', 0;
reconfigure with override;
*/
SET NOCOUNT ON;
DECLARE
@file VARCHAR(1000),
@path VARCHAR(255),
@cmd VARCHAR(2048);
SELECT
@file = 'foo.zip',
@path = 'C:\wherever\';
SELECT @cmd = 'dir /b "' + @path + @file + '"';
CREATE TABLE #x(a VARCHAR(1255));
INSERT #x EXEC master..xp_cmdshell @cmd;
IF EXISTS (SELECT 1 FROM #x WHERE a = @file)
PRINT 'file exists';
ELSE
PRINT 'file does not exist';
DROP TABLE #x;
編輯。它顯示錶中或數據庫中的文件列表,並指示該文件是僅位於一個位置還是兩者。它假定路徑+文件是< = 900個字符長(僅能夠在至少一側使用索引)。
USE tempdb;
GO
CREATE TABLE dbo.files(f VARCHAR(1000));
INSERT dbo.files(f) SELECT 'zip_that_does_not_exist.zip'
UNION ALL SELECT 'c:\path\file_that_does_not_exist.zip'
UNION ALL SELECT 'c:\path\file_that_exists.zip'
UNION ALL SELECT 'zip_that_exists.zip';
DECLARE
@path VARCHAR(255),
@cmd VARCHAR(2048);
SELECT
@path = path_column,
@cmd = 'dir /b "' + path_column + '"'
FROM
dbo.table_that_holds_path;
CREATE TABLE #x(f VARCHAR(900) UNIQUE);
INSERT #x EXEC master..xp_cmdshell @cmd;
DELETE #x WHERE f IS NULL;
UPDATE #x SET f = LOWER(f);
WITH f AS
(
SELECT f = REPLACE(LOWER(f), LOWER(@path), '')
FROM dbo.files
)
SELECT
[file] = COALESCE(x.f, f.f),
[status] = CASE
WHEN x.f IS NULL THEN 'in database, not in folder'
WHEN f.f IS NULL THEN 'in folder, not in database'
ELSE 'in both' END
FROM
f FULL OUTER JOIN #x AS x
ON x.f = f.f;
DROP TABLE #x, dbo.files;
可以使用無證PROC xp_fileexist
將返回1,如果它存在,否則爲0
SET NOCOUNT ON
DECLARE @iFileExists INT
EXEC master..xp_fileexist 'c:\bla.txt',
@iFileExists OUTPUT
select @iFileExists
您是否需要額外的權限來執行文件讀取操作 - 正如您在設置inital sql帳戶時默認沒有的權限一樣? –
xp_fileexist在SQL Server運行IIRC的帳戶下運行,由維護作業和其他內部函數使用 – SQLMenace
啊,非常酷。謝謝:) –
- 1. 如何使用JQuery驗證Sql中是否存在記錄?
- 2. 如何使用VB腳本驗證文件是否存在
- 3. 驗證圖像文件是否存在
- 4. 如何驗證SSIS包中是否存在平面文件?
- 5. 文件不存在驗證文件名是否存在SaveFileDialog?
- 6. 驗證是否存在使用msbuild擴展包的文件夾?
- 7. 如何使用Jquery驗證表單中是否存在ACTION?
- 8. 如何使用jQuery驗證DOM中是否存在元素?
- 9. 如何使用C#驗證XML文件是否中斷
- 10. 如何驗證Blobstore文件記錄是否已存在?
- 11. 如何驗證是否存在angularjs
- 12. 如何驗證PDF文件是否「好」?
- 13. 如何使用zend驗證器檢查文件是否存在 - zend框架2.0
- 14. 如何驗證文件是否存在於使用Javascript的另一個域上
- 15. 驗證文本是否已經存在
- 16. 如何驗證文件是否存在於DOS(Windows命令提示符).BAT文件中?
- 17. 驗證是否存在
- 18. 如何在Windows命令或PowerShell中驗證文件是否可訪問?
- 19. 如何使用Selenium和Java驗證警報是否存在
- 20. 如何使用Java驗證是否存在JMS隊列?
- 21. 如何驗證文件是否爲PowerShell中的壓縮文件
- 22. 如何驗證文件是laravel驗證中的「真實文件」
- 23. 如何驗證Eclipse是否使用NDK?
- 24. 驗證指定路徑中是否存在.exe文件
- 25. 如何驗證API調用中是否存在參數
- 26. 如何在sh或bash中驗證xml文件是否有效?
- 27. SQL Windows驗證
- 28. 如何驗證文件是否是PHP中的圖片?
- 29. 如何驗證arg是否是Shell中的有效文件名?
- 30. 驗證SQL文件 - SQL驗證程序
謝謝你的回答,只是另一個問題。我如何使用包含我的「@path」的另一個表中的值在我的所有列上自動執行此腳本? – Diogo
是否所有文件都在同一個文件夾中,或者每個文件都可能位於不同的文件夾中?讓我猜,你在一列中有完整的路徑,而不是分開路徑和文件名? –
所有文件都在同一個文件夾中,每個文件都有(或可能有)數據庫的完整路徑。 – Diogo