Sql server 在MSSQL中将多个CSV文件加载到多个表中
我的股票数据是.CSV(总共500个CSV)。我的目标是创建一个包含多个名为“a”、“B”的表的数据库,其中a和B指的是两种不同的股票。 我已经在数据库中加载了一个表,其中包含一个包含所有500个符号的列 我想迭代每一行,以便读取CSV并在数据库中为该股票创建一个表。例如,如果符号表中的第一行是“A”,则我希望通过读取名为“/path/A.csv”的csv文件在数据库中创建一个名为A的表 所有的表都有相同的结构。有四列“日期”、“打开”、“高”、“低”、“关闭”、“体积” 我已经为一种股票创建了一个表。例如,在股票A的情况下,使用以下代码Sql server 在MSSQL中将多个CSV文件加载到多个表中,sql-server,database,csv,Sql Server,Database,Csv,我的股票数据是.CSV(总共500个CSV)。我的目标是创建一个包含多个名为“a”、“B”的表的数据库,其中a和B指的是两种不同的股票。 我已经在数据库中加载了一个表,其中包含一个包含所有500个符号的列 我想迭代每一行,以便读取CSV并在数据库中为该股票创建一个表。例如,如果符号表中的第一行是“A”,则我希望通过读取名为“/path/A.csv”的csv文件在数据库中创建一个名为A的表 所有的表都有相同的结构。有四列“日期”、“打开”、“高”、“低”、“关闭”、“体积” 我已经为一种股票创建了
create table A(
[Date] datetime2(7) NOT NULL,
[Open] float NULL,
High float NULL,
Low float NULL,
[close] float NULL,
Volume float NULL
)
BULK INSERT A
FROM 'D:\ASX\A.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',', --CSV field delimiter
ROWTERMINATOR = '\n', --Use to shift the control to next row
TABLOCK
)
由于我无法手动将名称从A更改为B和C,直到达到500,因此我想知道如何从符号表中迭代500行,以便每次迭代时,我的上述代码从A更改为B,再更改为C,依此类推。下面是使用您现有的设计
DECLARE @Path nvarchar(255) = 'D:\ASX';
DECLARE @SQL nvarchar(MAX);
SET @SQL = (SELECT N'
CREATE TABLE dbo.' + QUOTENAME(ticker) + N'(
[Date] datetime2(7) NOT NULL,
[Open] float NULL,
High float NULL,
Low float NULL,
[close] float NULL,
Volume float NULL
);
BULK INSERT ' + QUOTENAME(ticker) + N'
FROM ''' + @Path + N'\' + ticker + N'.csv''
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = '','', --CSV field delimiter
ROWTERMINATOR = ''\n'', --Use to shift the control to next row
TABLOCK
);'
FROM dbo.symbols
FOR XML PATH(''), TYPE).value('.',N'nvarchar(MAX)');
EXECUTE sp_executesql @SQL;
GO
我建议您重新考虑这个设计,创建一个带有ticker符号列的表,并将所有文件导入到一个表中。下面是此方法的一个示例:
CREATE TABLE dbo.all_tickers(
ticker_symbol varchar(32) NOT NULL,
[Date] datetime2(7) NOT NULL,
[Open] float NULL,
High float NULL,
Low float NULL,
[close] float NULL,
Volume float NULL,
PRIMARY KEY (ticker_symbol, [Date])
);
GO
DECLARE @Path nvarchar(255) = 'D:\ASX';
DECLARE @SQL nvarchar(MAX);
CREATE TABLE #ticker_staging(
[Date] datetime2(7) NOT NULL,
[Open] float NULL,
High float NULL,
Low float NULL,
[close] float NULL,
Volume float NULL
);
SET @SQL = (SELECT N'
TRUNCATE TABLE #ticker_staging;
BULK INSERT #ticker_staging
FROM ''' + @Path + N'\' + ticker + N'.csv''
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = '','', --CSV field delimiter
ROWTERMINATOR = ''\n'', --Use to shift the control to next row
TABLOCK
);
INSERT INTO dbo.all_tickers WITH (TABLOCKX)(
ticker_symbol,
[Date],
[Open],
High,
Low,
[close],
Volume
)
SELECT
''' + ticker + N''',
[Date],
[Open],
High,
Low,
[close],
Volume
FROM #ticker_staging;'
FROM dbo.symbols
FOR XML PATH(''), TYPE).value('.',N'nvarchar(MAX)');
EXECUTE sp_executesql @SQL;
GO
您是否有符号列表或仅从目录中的文件派生?似乎最好添加一个符号列并将所有文件导入到一个表中。这个实体更适合于关系数据库,我有另一个名为symbols的表,其中包含一个名为Ticker的列,有500行,其中每行都是一个Ticker。例如,第一行将命名为“A”。否。不要按库存创建表。创建一个包含股票代码的附加列的表我对每个股票都有单独的CSV,因此即使创建一个包含股票代码附加列的数据表,我也需要在读取CSV时运行循环。我该怎么做?@f_hashim,我在我的答案中添加了一个规范化表设计的示例。要创建一个表,我需要一个包含所有符号数据的CSV以及一个附加列,或者一个表可以通过在多个CSV中包含数据来实现?@f_hashim,不需要一个,尽管为了避免动态SQL,这是可取的。我为单个目标表和多个源文件添加了一个示例。我正在通过你的例子来建立一个更好的理解,我相信一个单一的表格将是更可行的。