2017-09-25 98 views
0

我們有一個接口,它具有以下名稱格式創建日常三個文件:檢查文件內容的SQL Server 2008 R2

  1. FileAYYYYMMDD(例如:FileA20170925)
  2. FileBYYYYMMDD(例如:FileB20170925)
  3. FileCYYYYMMDD (例如:FileC20170925)

有人需要手動檢查以確定這些文件是否爲空。我想自動化這一步。

我想知道的是: 有沒有一種方法可以通過SQL查詢或SQL作業確定這些文件是否爲空(Yes或No是否足夠好)?

+0

[是](https://www.red-gate.com/simple-talk/sql/t-sql-programming/reading-and-writing-files-in- sql-server-using-t-sql /) – MatSnow

+0

我不需要讀取文件。我只需要知道三個文件是否爲空。加上每天的文件名稱更改,因爲YYYYMMDD附加。 – NonProgrammer

+0

在我第一次提到的問題下,評論中有一個鏈接。我現在改變了鏈接。應該可以根據需要調整用戶定義的功能。順便說一句:你明確地寫了「是」或「否」就夠了。 ;-) – MatSnow

回答

1

你應該能夠從這種site存儲過程spFileDetails獲得文件大小。

如果文件大小是0那麼文件是空的。 這是存儲過程的副本。由於 「菲爾因子」

/****** Object: StoredProcedure [dbo].[spFileDetails] Script Date: 03/28/2007 15:28:15 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[spFileDetails] 
@Filename VARCHAR(100) 

/* 
spFileDetails 'c:\autoexec.bat' 
*/ 
AS 
DECLARE @hr INT,   --the HRESULT returned from 
     @objFileSystem INT,    --the FileSystem object 
     @objFile INT,   --the File object 
     @ErrorObject INT,  --the error object 
     @ErrorMessage VARCHAR(255),--the potential error message 
     @Path VARCHAR(100),-- 
     @ShortPath VARCHAR(100), 
     @Type VARCHAR(100), 
     @DateCreated datetime, 
     @DateLastAccessed datetime, 
     @DateLastModified datetime, 
     @Attributes INT, 
     @size INT 



SET nocount ON 

SELECT @hr=0,@errorMessage='opening the file system object ' 
EXEC @hr = sp_OACreate 'Scripting.FileSystemObject', 
             @objFileSystem OUT 
IF @hr=0 SELECT @errorMessage='accessing the file ''' 
             [email protected]+'''', 
     @[email protected] 
IF @hr=0 EXEC @hr = sp_OAMethod @objFileSystem, 
     'GetFile', @objFile out,@Filename 
IF @hr=0 
     SELECT @errorMessage='getting the attributes of ''' 
             [email protected]+'''', 
     @[email protected] 
IF @hr=0 EXEC @hr = sp_OAGetProperty 
      @objFile, 'Path', @path OUT 
IF @hr=0 EXEC @hr = sp_OAGetProperty 
      @objFile, 'ShortPath', @ShortPath OUT 
IF @hr=0 EXEC @hr = sp_OAGetProperty 
      @objFile, 'Type', @Type OUT 
IF @hr=0 EXEC @hr = sp_OAGetProperty 
      @objFile, 'DateCreated', @DateCreated OUT 
IF @hr=0 EXEC @hr = sp_OAGetProperty 
      @objFile, 'DateLastAccessed', @DateLastAccessed OUT 
IF @hr=0 EXEC @hr = sp_OAGetProperty 
      @objFile, 'DateLastModified', @DateLastModified OUT 
IF @hr=0 EXEC @hr = sp_OAGetProperty 
      @objFile, 'Attributes', @Attributes OUT 
IF @hr=0 EXEC @hr = sp_OAGetProperty 
      @objFile, 'size', @size OUT 


IF @hr<>0 
     BEGIN 
     DECLARE 
       @Source VARCHAR(255), 
       @Description VARCHAR(255), 
       @Helpfile VARCHAR(255), 
       @HelpID INT 

     EXECUTE sp_OAGetErrorInfo @errorObject, 
       @source output,@Description output, 
           @Helpfile output,@HelpID output 

     SELECT @ErrorMessage='Error whilst ' 
           [email protected]+', ' 
           [email protected] 
     RAISERROR (@ErrorMessage,16,1) 
     END 
EXEC sp_OADestroy @objFileSystem 
EXEC sp_OADestroy @objFile 
SELECT [Path]= @Path, 
     [ShortPath]= @ShortPath, 
     [Type]= @Type, 
     [DateCreated]= @DateCreated , 
     [DateLastAccessed]=  @DateLastAccessed, 
     [DateLastModified]=  @DateLastModified, 
     [Attributes]= @Attributes, 
     [size]= @size 
RETURN @hr 
1

根據MatSnow的建議,我能夠找到/創建spFileDetails存儲過程。使用這個存儲過程,我能夠創建SSRS報告,這將幫助我自動化過程。另外,我甚至可以傳遞一個日期參數評估歷史文件:

declare @FileDATE AS VARCHAR(8) 
select @FileDATE = (SELECT CONVERT(VARCHAR(10), @ReportDate, 112)) 

DECLARE @FolderLocation as varchar(200) 
select @FolderLocation = ('\\share\\Validation\File' + @FileDATE + '.txt') 

DECLARE @FolderLocationA as varchar(200) 
select @FolderLocationA = ('\\share\\Validation\FileA' + @FileDATE + '.txt') 

DECLARE @FolderLocationB as varchar(200) 
select @FolderLocationB = ('\\share\\Validation\FileB' + @FileDATE + '.txt') 


DECLARE @TempTable Table(
[Path] varchar(300),  
ShortPath varchar(300), 
[Type] varchar(20), 
DateCreated date, 
DateLastAccessed date, 
DateLastModified date, 
Attributes int , 
size int) 

INSERT INTO @TempTable 
Execute dba.dbo.uspGetFileDetails @FolderLocation 
INSERT INTO @TempTable 
Execute dba.dbo.uspGetFileDetails @FolderLocationA 
INSERT INTO @TempTable 
Execute dba.dbo.uspGetFileDetails @FolderLocationB 

Select * from @TempTable