将数据导入到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
)
答
对于临时风格数据导入我有时有利于从文件本身选择以再处理它的使用批量插入免除。你可以通过创建一个程序来读取你的文件为一个表格:
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
希望帮助一点点?
你在所有三个版本上运行这个?表格定义是什么? – 2014-10-07 19:23:21
正如错误所暗示的那样,您在第2列数据上遇到了截断问题。什么是你的表格模式导入到表格中? – Kritner 2014-10-07 19:23:34
这个错误可能occure由于不正确的ROWTERMINATOR – Sagar 2014-10-07 19:29:13