2017-09-25 95 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