【发布时间】:2022-01-26 10:47:11
【问题描述】:
我正在尝试将多个 CSV 文件批量上传到 SSMS。 我使用适当的列名创建了表,但是当我执行代码时,对包含 CSV 文件的文件夹的访问被拒绝。
我在网上看到您需要将文件存储在服务器所在的同一位置,但这对我来说不是一个选项。
我也尝试编辑 CSV 文件所在文件夹的权限,但访问仍然被拒绝。
有没有人可以解决这个问题,我已经花了好几个小时试图找到一个。
我的代码
1.创建一个表来存储 CSV 信息。
CREATE TABLE [dbo].[data_cube](
[Name] [nvarchar](1000) NULL,
[Country][nvarchar](1000) NULL,
[Occupation][nvarchar](1000) NULL,
[Hobby][nvarchar](1000) NULL
) on [Primary]
2。创建表以存储有关导入文件的信息
CREATE TABLE [dbo].[files_logtable](
[id] [int] IDENTITY(1,1) NOT NULL,
[filename] [varchar](200) NULL,
[date_created] [datetime] DEFAULT GETDATE()
)ON [Primary]
3.创建存储过程
CREATE PROCEDURE import_files @filepath varchar(500), @pattern varchar(100), @tablename varchar(100)
AS
BEGIN
DECLARE @query varchar(1000), @moveProcessed varchar(1000)
CREATE TABLE #x(name varchar(200))
set @query = 'master.dbo.xp_cmdshell "dir '+@filepath+@pattern+' /b"'
insert #x exec (@query)
delete from #x where name IS NULL
select identity(int,1,1) as ID,name into #y from #x
drop table #x
Declare @max1 int, @count1 int, @filename varchar(200)
set @max1 = (select max(ID) from #y)
set @count1 = 0
while @count1 < @max1
BEGIN
SET @count1 = @count1+1
SET @filename = (select name from #y where [id]=@count1)
set @query = 'BULK INSERT '+@tablename+' FROM "'+@filepath+@filename+'" WITH (FIELDTERMINATOR = '','',FIRSTROW=1,ROWTERMINATOR=''\n'')'
EXEC (@query)
insert into file_logtable(filename) select @filename
set @moveProcessed = 'MOVE "'+@filepath+@filepath+'" C:\Users\cob2202\Desktop\Files\Data Cube\FlatFileDestination\"'+SUBSTRING(@filename,1, LEN(@filename) -4)+'_'+cast(FORMAT(getdate(),'yyyMMDDHHmmss') as varchar)+'.csv"'
EXEC master..XP_cmdshell @moveProcessed
END
END
4.读入文件
Exec import_files 'C:\Users\cob2202\Desktop\Files\Data Cube\FlatFileSource\', '*.csv', 'data_cube'
【问题讨论】:
标签: sql csv bulkinsert