Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在sql中对物理文件进行子串_Sql Server_Tsql_Cmd_Command Prompt - Fatal编程技术网

Sql server 如何在sql中对物理文件进行子串

Sql server 如何在sql中对物理文件进行子串,sql-server,tsql,cmd,command-prompt,Sql Server,Tsql,Cmd,Command Prompt,我有服务器A的这个.txt文件,我需要用它执行例程A,如果.txt文件超过1天,例程A将被执行。。。我有这个现有的代码,但只计算文件的数量,然后执行rountine A 来自服务器A的示例文件:file_item.20151109.txt-自11月9日起,我需要执行例程A。。。知道如何从物理文件中执行例程A吗 你知道我为什么做不到吗 IF object_id('tempdb.dbo.#tblFiles') > 0 BEGIN DROP TABLE #tblFiles END CR

我有服务器A的这个.txt文件,我需要用它执行例程A,如果.txt文件超过1天,例程A将被执行。。。我有这个现有的代码,但只计算文件的数量,然后执行rountine A

来自服务器A的示例文件:file_item.20151109.txt-自11月9日起,我需要执行例程A。。。知道如何从物理文件中执行例程A吗

你知道我为什么做不到吗

IF object_id('tempdb.dbo.#tblFiles') > 0 
BEGIN
    DROP TABLE #tblFiles
END
CREATE TABLE #tblFiles (FileNames varchar(1000))

SET @CmdShell = 'master.dbo.xp_cmdshell ''' + 'Dir ' + @SourceCode + ' /b'' '
INSERT INTO #tblFiles exec (@CmdShell)
Set @RowCnt = @@RowCount - 1

IF @RowCnt is not null
--=3 and (@MaxLogProcDt < @MaxOPTProcDt)
--IF (@MaxLogProcDt < @MaxOPTProcDt)
BEGIN   
        DECLARE cFileName CURSOR FOR    
        SELECT * FROM #tblFiles
        OPEN cFileName
        FETCH NEXT FROM cFileName INTO @FileName

SELECT @Test = SUBSTRING(@FileName, 11,8)
--WHILE (@@fetch_status = 0)    
END

IF @Test = @YYYYMMDD
--BEGIN ROUTINE A
ELSE
--HOUSEKEEP FILES ROUTINE

您可以这样做来获取文件上最后一次修改的日期,然后从现在开始减去它,然后根据差值执行例行程序,修改后在注释中使用光标

if exists(select 1 from tempdb..sysobjects where name='##temp')
drop table ##temp
create table ##temp(mdate varchar(8000))
insert ##temp
exec master.dbo.xp_cmdshell 'dir c:\' 
set rowcount 5
delete from ##temp
set rowcount 0
--select * from ##temp
delete top(3) FROM ##temp where mdate in (select top (3) mdate from ##temp order by mdate asc) 
--select * from ##temp

DECLARE FileCursor 
CURSOR FOR 
  SELECT mdate
  FROM ##temp 
  WHERE DATEDIFF(dd, SUBSTRING(mdate, 1, 20), GETDATE() ) < 1 

DECLARE @A VarChar(8000)
OPEN FileCursor
FETCH NEXT FROM FileCursor INTO @A

WHILE (@@FETCH_STATUS = 0)
BEGIN
    --Do Routine A
    PRINT @A
    FETCH NEXT FROM FileCursor INTO @A
END

CLOSE FileCursor
DEALLOCATE FileCursor

我将忽略行数行,我需要根据文件名执行例程A,该文件名包含物理文件的日期YYYYMMDD或修改的日期。设置行数n用于?这条线是干什么的?从tmpset rowcount 5中选择top1 substringmydate,1,20作为“上次修改的日期”,将exec的结果集限制为5行,最后一次删除基本上会从dir中删除头。可能需要进行实验才能正确。i、 你需要在你的系统上做一个dir,看看格式是怎样的,然后去掉你不需要的,用一个子串从右边的行中抓取日期。修改答案代码,这在我的系统上运行。我制作了一个新的文本文件,得到了这个结果72行受影响5行受影响2行受影响2015年11月10日1:08修改了我的问题,请注意,如果您查看我的代码,您的帮助将非常感谢。不确定您在@YYYYMMDD上测试的是什么,具体日期?如果您在系统上执行了dir,您将看到输出中有行包含除文件名和日期之外的其他内容,您需要去掉这些内容。这就是我对设置rowcount 5、0和delete from temp所做的,虽然top 5和bottom 3可能只有2,但不确定是否应该计算空行。这样的话,你的测试的最新时间将一直有效。