2011-08-15 12 views

答えて

1

おそらく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'の代わりに読み、離れて行く。

(注:()

3

私は、これが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のための理想的な候補であるということでした
0

- あなたが始めるために優秀な記事のカップル - あなたはそれ

TSQLソリューションを初めて使用する場合はSSISはかなり急な学習曲線を持っていることを除き、 :

http://www.mssqltips.com/tip.asp?tip=1263

http://www.simple-talk.com/sql/t-sql-programming/reading-and-writing-files-in-sql-server-using-t-sql/

SSISソリューション: - 1件の記事あなたが始めるために:

http://www.sqlis.com/post/Looping-over-files-with-the-Foreach-Loop.aspx

0

私は、これは非常に古いポストであることを知っているが、私は次のリンク内の溶液が私のために完全に働いたことがわかった:http://www.databaseskill.com/2219220/

関連する問題