.txtファイルを含むフォルダをループして最新のファイルを取得し、SQL Server 2005ストアドプロシージャを使用してテーブルに内容を追加する方法を教えてください。SQL Server 2005ストアドプロシージャを使用してフォルダ内のファイルをループする
ありがとうございました。
SateeshChandra。
.txtファイルを含むフォルダをループして最新のファイルを取得し、SQL Server 2005ストアドプロシージャを使用してテーブルに内容を追加する方法を教えてください。SQL Server 2005ストアドプロシージャを使用してフォルダ内のファイルをループする
ありがとうございました。
SateeshChandra。
おそらくadaptになる可能性のあるこのブログ記事に便利な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 @[email protected], @strErrorMessage='Opening file "'[email protected]+'\'[email protected]+'"',@[email protected]+'\'[email protected]
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 @[email protected],
@strErrorMessage='finding out if there is more to read in "'[email protected]+'"'
if @HR=0 execute @hr = sp_OAGetProperty @objTextStream, 'AtEndOfStream', @YesOrNo OUTPUT
IF @YesOrNo<>0 break
if @HR=0 Select @[email protected],
@strErrorMessage='reading from the output file "'[email protected]+'"'
if @HR=0 execute @hr = sp_OAMethod @objTextStream, 'Readline', @String OUTPUT
INSERT INTO @file(line) SELECT @String
END
if @HR=0 Select @[email protected],
@strErrorMessage='closing the output file "'[email protected]+'"'
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
使用法:
Select line from
Dbo.uftReadfileAsTable('MyPath','MyFileName')
where line not like '#%'
ちょうどあなたがしたいファイルへの既存のファイル名とパスを記入'MyPath'と 'MyFileName'の代わりに読み、離れて行く。
(注:()
私は、これがSQL CLRのためのより良い仕事があることを示唆しているか:別の質問のためのソリューションへのリンクが死んだので、私はdownvotedてきたので、私は元のソースを含めましたC#のコマンドラインアプリケーションのような外部ツールですが、これはSQL内でさまざまな方法で行うことができますが、本質的に安全でなく、潜在的に問題のあるものです。
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:ファイル名の決定には、ファイル名にスペースが含まれていないことが前提です。もしそうであれば、上記の少なくとも1行は再訪する必要があります。
私の最初の考えは、これはSSISのための理想的な候補であるということでした- あなたが始めるために優秀な記事のカップル - あなたはそれ
TSQLソリューションを初めて使用する場合はSSISはかなり急な学習曲線を持っていることを除き、 :
http://www.mssqltips.com/tip.asp?tip=1263
SSISソリューション: - 1件の記事あなたが始めるために:
http://www.sqlis.com/post/Looping-over-files-with-the-Foreach-Loop.aspx
私は、これは非常に古いポストであることを知っているが、私は次のリンク内の溶液が私のために完全に働いたことがわかった:http://www.databaseskill.com/2219220/