【问题标题】:Stored Procedure to import data into SQL Server database... Error将数据导入 SQL Server 数据库的存储过程...错误
【发布时间】:2014-10-07 19:19:50
【问题描述】:

我有一个文本文件file1.txt,格式如下。第 1 列是 AGUSR1,第 2 列是 AGUSR2。文件中有3条记录:

"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 是输入文本文件所在的远程服务器。

在执行时,我收到以下错误 -

消息 4863,第 16 级,状态 1,第 1 行
第 1 行第 2 列 (AGUSR2) 的批量加载数据转换错误(截断)。

导入到表模式是

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

【问题讨论】:

  • 你在所有三个版本上都运行这个?表定义是什么?
  • 正如错误所暗示的,您遇到了第 2 列数据的截断问题。导入表的表架构是什么?
  • 这个错误可能是由于不正确的 Rowterminator 造成的
  • 导入表模式是- CREATE TABLE [dbo].[file1]( [AGUSR1] [varchar](10) NULL, [AGUSR2] [varchar](10) NULL )
  • 我也试过了,您的表中将有带双引号的值。

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2012


【解决方案1】:

对于临时样式的数据导入,我有时会放弃使用 BULK INSERTS 来支持从文件本身中选择然后处理它。您可以通过创建一个将文件作为表格读取的过程来做类似的事情:

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 @objErrorObject=@objFileSystem, @strErrorMessage='Opening file "'+@path+'\'+@filename+'"',@command=@path+'\'+@filename

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 @objErrorObject=@objTextStream, 
        @strErrorMessage='finding out if there is more to read in "'+@filename+'"'
    if @HR=0 execute @hr = sp_OAGetProperty @objTextStream, 'AtEndOfStream', @YesOrNo OUTPUT

    IF @YesOrNo<>0  break
    if @HR=0 Select @objErrorObject=@objTextStream, 
        @strErrorMessage='reading from the output file "'+@filename+'"'
    if @HR=0 execute @hr = sp_OAMethod  @objTextStream, 'Readline', @String OUTPUT
    INSERT INTO @file(line) SELECT @String
    END

if @HR=0 Select @objErrorObject=@objTextStream, 
    @strErrorMessage='closing the output file "'+@filename+'"'
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].[file1]:

;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

希望能有所帮助?!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多