2017-08-20 70 views
1

使用openrowset,我將XML文件加載到臨時表。如何獲取文件在SQL中創建日期?

如何獲取文件創建日期?

CREATE TABLE #T 
(
    IntCol int, 
    XmlCol xml 
); 

INSERT INTO #T (XmlCol) 
    SELECT * 
    FROM OPENROWSET(BULK 'c:\Test.xml', SINGLE_BLOB) AS x; 

SELECT * FROM #t 
+1

您可能會發現更容易將文件的創建日期添加到XML文件作爲創建過程的一部分! –

+0

我們從第三方獲取xml文件..以feed的形式進入。 – goofyui

+0

我會用另一種語言來讀取所有的文件信息,但是如果你必須堅持SQL,你可能想看看[這裏](https://www.sqlservercentral.com/Forums/Topic494395-149-1.aspx) –

回答

1

T-SQL不是您可以訪問文件系統的語言。但是,您可以在C#中編寫存儲過程來完成此任務。您可以使用.Net Framework中的相應類讀取元數據。您可以使用CLR集成編寫自定義函數,從文件系統獲取所需的每個信息。

這裏是一個小的工作樣本,以得到一個文件的創建日期與CLR集成在C#:

public class UserDefinedFunctions 
{ 
    [SqlFunction] 
    public static SqlDateTime GetCreatedDate(SqlString filePath) 
    { 
     return filePath.IsNull ? SqlDateTime.Null : File.GetCreationTime(filePath.Value); 
    } 
} 

那麼你已經有了部署大會,並將其註冊到SQL Server,然後創建適當的功能與創建功能命令。

看到更多CodeProject Sample

+0

得到詳細信息謝謝。我們能夠從SQL獲取所有細節。但是,只有缺失部分是文件創建日期。我可以通過master.XP_CMDShell獲得 - 我們沒有使用內置sp ..出於安全原因 – goofyui

+0

@goofyui不能使用CLR嗎? –

0

不是最簡潔的方式來做到這一點,但在SQL Server中使用OLE自動化是獲得此信息的一種方式。以下示例使用C:\Temp\testfile.txt作爲示例。這不是真的「SQL」,不知道這對你是否夠好。

DECLARE @hr INT; 
DECLARE @dt_created DATETIME; 
DECLARE @obj_file INT; 
DECLARE @obj_file_system INT; 
DECLARE @file_name VARCHAR(100)='C:\Temp\testfile.txt'; 

-- Create a FileSystemObject. Create this once for all subsequent file manipulation. Don't forget to destroy this object once you're done with file manipulation (cf cleanup) 
EXEC @hr = sp_OACreate 'Scripting.FileSystemObject', @obj_file_system OUT; 
IF @hr<>0 GOTO __cleanup; 

-- Get a handle for the file. Don't forget to release the handle for each file you get a handle for (see cleanup). The return will be different from 0 if the file doesn't exist 
EXEC @hr = sp_OAMethod @obj_file_system, 'GetFile', @obj_file out, @file_name; 
IF @hr<>0 GOTO __print_created_date; 

-- Retrieve the created date. 
EXEC sp_OAGetProperty @obj_file, 'DateCreated', @dt_created OUT; 

__print_created_date: 
SELECT @dt_created AS file_date; 

__cleanup: 
EXEC sp_OADestroy @obj_file_system; 
EXEC sp_OADestroy @obj_file; 

OLE自動化需要,但(僅一次)啓用第一:

sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
sp_configure 'Ole Automation Procedures', 1; 
GO 
RECONFIGURE; 
GO 
相關問題