1

我使用以下格式的文本文件file1.txt。第1欄是AGUSR1 &第2欄是AGUSR2。有3條記錄在文件中:將數據導入到SQL Server數據庫的存儲過程...錯誤

"AGUSR1"|"AGUSR2" 
"JASON "|"DEBBIE " 
"JOY "|"JASON  " 
"ANNA "|"JOHN  " 

我寫了一個存儲過程,這個文本文件上傳到一個SQL Server數據庫這樣的:

CREATE PROCEDURE sp_Import 
    @TableName varchar(200), 
    @FilePath varchar(200) 
AS 
    DECLARE @SQL varchar(5000) 

    SET @SQL = 'BULK INSERT ' + @TableName + ' FROM ''' + @FilePath + 
       ''' WITH (FIELDTERMINATOR = ''|'', ROWTERMINATOR = ''{CR}{LF}'')' 

    EXEC (@SQL) 

要執行它,我已經使用這個說法:

EXEC sp_Import '[DB_DEMO].[dbo].[file1]' , '\\kacl1tsp048\DEMO\file1.txt' 

注意:kacl1tsp048是輸入文本文件所在的遠程服務器。

在執行時,我得到下面的錯誤 - 對第1行,第2列

消息4863,級別16,狀態1,行1
批量加載數據轉換錯誤(截斷)(AGUSR2) 。

進口到表架構是

CREATE TABLE [dbo].[file1] 
(
    [AGUSR1] [varchar](10) NULL, 
    [AGUSR2] [varchar](10) NULL 
) 
+0

你在所有三個版本上運行這個?表格定義是什麼? – 2014-10-07 19:23:21

+0

正如錯誤所暗示的那樣,您在第2列數據上遇到了截斷問題。什麼是你的表格模式導入到表格中? – Kritner 2014-10-07 19:23:34

+0

這個錯誤可能occure由於不正確的ROWTERMINATOR – Sagar 2014-10-07 19:29:13

回答

1

對於臨時風格數據導入我有時有利於從文件本身選擇以再處理它的使用批量插入免除。你可以通過創建一個程序來讀取你的文件爲一個表格:

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 

現在你有一個proc文件轉換爲表。你仍然必須處理您的分隔符的格式,所以你可以運行這樣的事情來填充[DBO] [文件1]:

;WITH Split_Names (Value,Name, xmlname) 
AS 
(
    SELECT 
     [LineNo], 
     line, 
     CONVERT(XML,'<Lines><line>' 
     + REPLACE(line,'"|"', '</line><line>') + '</line></Lines>') AS xmlname 
    from [dbo].[uftReadfileAsTable]('\\kacl1tsp048\DEMO\file1.txt') 
    where line not like '"AGUSR1"%' 
) 
SELECT 
    Value,  
    RTRIM(REPLACE(xmlname.value('/Lines[1]/line[1]','varchar(100)'),'"', '')) AS AGUSR1,  
    RTRIM(REPLACE(xmlname.value('/Lines[1]/line[2]','varchar(100)'),'"', '')) AS AGUSR2 
INTO [dbo].[file1] 
FROM Split_Names 

希望幫助一點點?

相關問題