将数据导入到SQL Server数据库的存储过程...错误

问题描述:

我使用以下格式的文本文件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

对于临时风格数据导入我有时有利于从文件本身选择以再处理它的使用批量插入免除。你可以通过创建一个程序来读取你的文件为一个表格:

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 

希望帮助一点点?