就是这样一个例子,但在编译时sql不能识别文件 它所得到的是aaa.txt而不是'aaa.txt' 这用print便知。下面是我的proc,大家指点一下吧. SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO/*1。创建各个临时数据表*/ /*3。统计下载数和访问数*/ ALTER proc tstj_first @threadid varchar(4) --输入参数,线程号; AS begin DECLARE @childfilename varchar(200) DECLARE @getdatafromtxt varchar(200) --创建游标childfile_cur得到子文件名 DECLARE childfile_cur SCROLL CURSOR FOR SELECT 子文件名 FROM tstjreport where 线程号=@threadid --打开游标 OPEN childfile_cur FETCH NEXT FROM childfile_cur --WHILE @@FETCH_STATUS = 0 --BEGIN print @childfilename --创建临时数据表; CREATE TABLE yd_xz ( 文件路径 varchar(50) NULL, 用户动作 varchar(3) NULL, 统计顺序 smallint DEFAULT 0 NULL )
set @str = 'BULK INSERT table FROM ' + @filename + ' WITH (DATAFILETYPE = ''char'',RowTerminator = ''\n'',FieldTerminator = ''|'')'
exec(@str)
char的两边不是双引号,是两个单引号
这个问题很简单,sqlserver中的转义字符就是把要转义的字符写两遍,这时vb这一系列的语言的共有特点。
给你个完整的例子吧create table tablea
(a char(10) primary key,
b char(10),
c char(10)
)a.txt文件内容:
a|b|c
d|e|f然后执行
declare @str varchar(500),
@filename varchar(10)
set @filename = '''d:\a.txt'''
set @str = 'BULK INSERT tablea FROM ' + @filename
+ ' WITH (DATAFILETYPE = ''char'',RowTerminator = ''\n'',FieldTerminator = ''|'')'
print @str
exec(@str)
你改成@str='',再exec。只要你将单引号重写之后一定能通过。
它所得到的是aaa.txt而不是'aaa.txt'
这用print便知。下面是我的proc,大家指点一下吧.
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO/*1。创建各个临时数据表*/
/*3。统计下载数和访问数*/
ALTER proc tstj_first
@threadid varchar(4) --输入参数,线程号;
AS
begin
DECLARE @childfilename varchar(200)
DECLARE @getdatafromtxt varchar(200)
--创建游标childfile_cur得到子文件名
DECLARE childfile_cur SCROLL CURSOR FOR SELECT 子文件名 FROM tstjreport where 线程号=@threadid
--打开游标
OPEN childfile_cur
FETCH NEXT FROM childfile_cur
--WHILE @@FETCH_STATUS = 0
--BEGIN
print @childfilename
--创建临时数据表;
CREATE TABLE yd_xz (
文件路径 varchar(50) NULL,
用户动作 varchar(3) NULL,
统计顺序 smallint DEFAULT 0 NULL
)
CREATE TABLE fw_count (
文件路径 varchar(50) NULL,
访问数 int NULL,
统计顺序 smallint DEFAULT 0 NULL
) CREATE TABLE xz_count (
文件路径 varchar(50) NULL,
下载数 int NULL,
统计顺序 smallint DEFAULT 0 NULL
)
CREATE TABLE ydxz_count (
文件路径 varchar(50) NULL,
下载数 int NULL,
访问数 int NULL,
统计顺序 smallint DEFAULT 0 NULL
)
--从文本中提取数据;
set @getdatafromtxt = 'BULK INSERT yd_xz FROM '+ @childfilename + 'WITH (DATAFILETYPE = ''char'',RowTerminator = ''\n'',FieldTerminator =''|'')'
print @getdatafromtxt
exec(@getdatafromtxt)
--统计下载数;
--统计访问数;
--统计下载数;
--删除临时表;
--drop table yd_xz
drop table fw_count
drop table xz_count
drop table ydxz_count
-- FETCH NEXT FROM childfile_cur into @childfilename
-- END CLOSE childfile_cur /*CREATE TABLE yd_xz (
文件路径 varchar(50) NULL,
用户动作 vachar(3) NULL,
统计顺序 smallint DEFAULT 0 NULL
) CREATE TABLE fy_count (
文件路径 varchar(50) NULL,
访问数 int NULL,
统计顺序 smallint DEFAULT 0 NULL
) CREATE TABLE xz_count (
文件路径 varchar(50) NULL,
下载数 int NULL,
统计顺序 smallint DEFAULT 0 NULL
) CREATE TABLE ydxz_count (
文件路径 varchar(50) NULL,
下载数 int NULL,
访问数 int NULL,
统计顺序 smallint DEFAULT 0 NULL
)
--统计下载数和访问数
insert into ydxz_count (文件路径,下载数,访问数,统计顺序)
select [xz_count].[文件路径],[xz_count].[下载数],[fy_count].[访问数],[xz_count].[统计顺序]
from xz_count,fy_count where [fy_count].[文件路径]=[xz_count].[文件路径];*/
endGO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
应该这样:
set @filename = 'd:\a.txt'
set @str = 'BULK INSERT tablea FROM ''' + @filename
+ ''' WITH (DATAFILETYPE = ''char'',RowTerminator = ''\n'',FieldTerminator = ''|'')'把单引号放到from 后面,不要放到@filename参数中.
declare @str varchar(500)
set @str = "BULK INSERT table FROM @filename WITH (DATAFILETYPE = 'char',RowTerminator = '\n',FieldTerminator = '|')
"exec(@str)