2011-08-15 47 views

回答

1

有一個方便的udf位於此博客文章,你可能可能adapt。我要去發佈腳本和使用的內容櫃面下面的網站死:

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',然後離開你。

(注:我已經包括了原來的來源,因爲我已經downvoted因爲對另一個問題的解決方案的鏈接死亡:()

3

我建議,這是對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:文件名的確定假定您的文件名沒有空格。如果他們這樣做,那麼至少有一行以上需要重新審視。

相關問題