Sql server 使用SQL Server 2005存储过程循环遍历文件夹中的文件
您能告诉我如何使用SQL Server 2005存储过程循环遍历包含.txt文件的文件夹,获取最新文件并将内容添加到表中吗 提前谢谢Sql server 使用SQL Server 2005存储过程循环遍历文件夹中的文件,sql-server,sql-server-2005,Sql Server,Sql Server 2005,您能告诉我如何使用SQL Server 2005存储过程循环遍历包含.txt文件的文件夹,获取最新文件并将内容添加到表中吗 提前谢谢 SateeshChandra.在这篇博文中有一个方便的udf,你可能会找到它。我将发布脚本内容和用法,以防以下网站死掉: Create FUNCTION [dbo].[uftReadfileAsTable] ( @Path VARCHAR(255), @Filename VARCHAR(100) ) RETURNS @File TABLE ( [LineNo]
SateeshChandra.在这篇博文中有一个方便的udf,你可能会找到它。我将发布脚本内容和用法,以防以下网站死掉:
Create FUNCTION [dbo].[uftReadfileAsTable]
(
@Path VARCHAR(255),
@Filename VARCHAR(100)
)
RETURNS
@File TABLE
(
[LineNo] int identity(1,1),
line varchar(8000))
AS
BEGIN
DECLARE @objFileSystem int
,@objTextStream int,
@objErrorObject int,
@strErrorMessage Varchar(1000),
@Command varchar(1000),
@hr int,
@String VARCHAR(8000),
@YesOrNo INT
select @strErrorMessage='opening the File System Object'
EXECUTE @hr = sp_OACreate 'Scripting.FileSystemObject' , @objFileSystem OUT
if @HR=0 Select @objErrorObject=@objFileSystem, @strErrorMessage='Opening file "'+@path+'\'+@filename+'"',@command=@path+'\'+@filename
if @HR=0 execute @hr = sp_OAMethod @objFileSystem , 'OpenTextFile'
, @objTextStream OUT, @command,1,false,0--for reading, FormatASCII
WHILE @hr=0
BEGIN
if @HR=0 Select @objErrorObject=@objTextStream,
@strErrorMessage='finding out if there is more to read in "'+@filename+'"'
if @HR=0 execute @hr = sp_OAGetProperty @objTextStream, 'AtEndOfStream', @YesOrNo OUTPUT
IF @YesOrNo<>0 break
if @HR=0 Select @objErrorObject=@objTextStream,
@strErrorMessage='reading from the output file "'+@filename+'"'
if @HR=0 execute @hr = sp_OAMethod @objTextStream, 'Readline', @String OUTPUT
INSERT INTO @file(line) SELECT @String
END
if @HR=0 Select @objErrorObject=@objTextStream,
@strErrorMessage='closing the output file "'+@filename+'"'
if @HR=0 execute @hr = sp_OAMethod @objTextStream, 'Close'
if @hr<>0
begin
Declare
@Source varchar(255),
@Description Varchar(255),
@Helpfile Varchar(255),
@HelpID int
EXECUTE sp_OAGetErrorInfo @objErrorObject,
@source output,@Description output,@Helpfile output,@HelpID output
Select @strErrorMessage='Error whilst '
+coalesce(@strErrorMessage,'doing something')
+', '+coalesce(@Description,'')
insert into @File(line) select @strErrorMessage
end
EXECUTE sp_OADestroy @objTextStream
-- Fill the table variable with the rows for your result set
RETURN
END
只需填写现有文件名和要读取的文件路径,而不是“MyPath”和“MyFileName”,就可以了
(注意:我包含了原始来源,因为我被否决了,因为另一个问题的解决方案的链接消失了:()在这篇博文中有一个方便的udf,你可能会看到。我将发布脚本的内容和用法,以防下面的网站消失:
Create FUNCTION [dbo].[uftReadfileAsTable]
(
@Path VARCHAR(255),
@Filename VARCHAR(100)
)
RETURNS
@File TABLE
(
[LineNo] int identity(1,1),
line varchar(8000))
AS
BEGIN
DECLARE @objFileSystem int
,@objTextStream int,
@objErrorObject int,
@strErrorMessage Varchar(1000),
@Command varchar(1000),
@hr int,
@String VARCHAR(8000),
@YesOrNo INT
select @strErrorMessage='opening the File System Object'
EXECUTE @hr = sp_OACreate 'Scripting.FileSystemObject' , @objFileSystem OUT
if @HR=0 Select @objErrorObject=@objFileSystem, @strErrorMessage='Opening file "'+@path+'\'+@filename+'"',@command=@path+'\'+@filename
if @HR=0 execute @hr = sp_OAMethod @objFileSystem , 'OpenTextFile'
, @objTextStream OUT, @command,1,false,0--for reading, FormatASCII
WHILE @hr=0
BEGIN
if @HR=0 Select @objErrorObject=@objTextStream,
@strErrorMessage='finding out if there is more to read in "'+@filename+'"'
if @HR=0 execute @hr = sp_OAGetProperty @objTextStream, 'AtEndOfStream', @YesOrNo OUTPUT
IF @YesOrNo<>0 break
if @HR=0 Select @objErrorObject=@objTextStream,
@strErrorMessage='reading from the output file "'+@filename+'"'
if @HR=0 execute @hr = sp_OAMethod @objTextStream, 'Readline', @String OUTPUT
INSERT INTO @file(line) SELECT @String
END
if @HR=0 Select @objErrorObject=@objTextStream,
@strErrorMessage='closing the output file "'+@filename+'"'
if @HR=0 execute @hr = sp_OAMethod @objTextStream, 'Close'
if @hr<>0
begin
Declare
@Source varchar(255),
@Description Varchar(255),
@Helpfile Varchar(255),
@HelpID int
EXECUTE sp_OAGetErrorInfo @objErrorObject,
@source output,@Description output,@Helpfile output,@HelpID output
Select @strErrorMessage='Error whilst '
+coalesce(@strErrorMessage,'doing something')
+', '+coalesce(@Description,'')
insert into @File(line) select @strErrorMessage
end
EXECUTE sp_OADestroy @objTextStream
-- Fill the table variable with the rows for your result set
RETURN
END
只需填写现有文件名和要读取的文件路径,而不是“MyPath”和“MyFileName”,就可以了
(注意:我包含了原始来源,因为我被否决了,因为另一个问题的解决方案链接失效:()我建议,对于SQL CLR或外部工具(如C#命令行应用程序),这是一项更好的工作。您可以在SQL中以各种方式执行此操作,但它们本身就不安全,并且可能存在问题。如果CLR或外部工具不是选项,我的方法通常是xp_cmdshell。需要首先启用:
EXEC sp_configure 'show adv', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_configure 'xp_cmdshell', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_configure 'show adv', 0;
GO
RECONFIGURE WITH OVERRIDE;
GO
然后你可以这样做:
SET NOCOUNT ON;
DECLARE
@folder NVARCHAR(2048),
@cmd NVARCHAR(MAX);
SET @folder = N'C:\path\';
SET @cmd = N'dir ' + @folder + '*.txt';
CREATE TABLE #x(n NVARCHAR(2048));
INSERT #x EXEC [master].dbo.xp_cmdshell @cmd;
DECLARE @filename NVARCHAR(2048);
;WITH x(n) AS (SELECT n FROM #x WHERE ISDATE(LEFT(n, 20)) = 1)
SELECT TOP 1 @filename = n FROM x
ORDER BY CONVERT(DATETIME, LEFT(n, 20)) DESC;
SET @cmd = N'type ' + @folder + SUBSTRING(@filename,
LEN(@filename) - CHARINDEX(' ', REVERSE(@filename)) + 2,
2048);
CREATE TABLE #y(n NVARCHAR(MAX));
INSERT #y EXEC [master].dbo.xp_cmdshell
-- no idea what "add the content into the table" means
-- but you can work with this:
SELECT n FROM #y;
DROP TABLE #x, #y;
注1:#x.n列中日期信息的宽度将根据您的区域设置/区域设置而变化。您可能需要进行实验
注2:文件名的确定假定您的文件名没有空格。如果有空格,则至少需要重新查看上面的一行。我建议,对于SQL CLR或C#命令行应用程序等外部工具来说,这是一项更好的工作。您可以在SQL中以各种方式执行此操作,但它们本身就不安全,而且可能存在问题。如果CLR或外部工具不是一个选项,我的方法通常是xp_cmdshell。需要首先启用它:
EXEC sp_configure 'show adv', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_configure 'xp_cmdshell', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_configure 'show adv', 0;
GO
RECONFIGURE WITH OVERRIDE;
GO
然后你可以这样做:
SET NOCOUNT ON;
DECLARE
@folder NVARCHAR(2048),
@cmd NVARCHAR(MAX);
SET @folder = N'C:\path\';
SET @cmd = N'dir ' + @folder + '*.txt';
CREATE TABLE #x(n NVARCHAR(2048));
INSERT #x EXEC [master].dbo.xp_cmdshell @cmd;
DECLARE @filename NVARCHAR(2048);
;WITH x(n) AS (SELECT n FROM #x WHERE ISDATE(LEFT(n, 20)) = 1)
SELECT TOP 1 @filename = n FROM x
ORDER BY CONVERT(DATETIME, LEFT(n, 20)) DESC;
SET @cmd = N'type ' + @folder + SUBSTRING(@filename,
LEN(@filename) - CHARINDEX(' ', REVERSE(@filename)) + 2,
2048);
CREATE TABLE #y(n NVARCHAR(MAX));
INSERT #y EXEC [master].dbo.xp_cmdshell
-- no idea what "add the content into the table" means
-- but you can work with this:
SELECT n FROM #y;
DROP TABLE #x, #y;
注1:#x.n列中日期信息的宽度将根据您的区域设置/区域设置而变化。您可能需要进行实验
注2:文件名的确定假定您的文件名没有空格。如果有空格,则至少需要重新查看上面的一行。我的第一个想法是,这是SSI的理想候选者-但如果您是新手,SSI的学习曲线相当陡峭 TSQL解决方案-几篇优秀的文章帮助您入门: SSIS解决方案:-一篇文章帮助您入门:
我的第一个想法是,这是SSI的理想候选者-除非SSI有一个相当陡峭的学习曲线,如果您是新手的话 TSQL解决方案-几篇优秀的文章帮助您入门: SSIS解决方案:-一篇文章帮助您入门:
我知道这是一篇非常古老的文章,但我发现以下链接中的解决方案对我非常有效:我知道这是一篇非常古老的文章,但我发现以下链接中的解决方案对我非常有效: