Sql server 在MSSQL中将多个CSV文件加载到多个表中

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的表 所有的表都有相同的结构。有四列“日期”、“打开”、“高”、“低”、“关闭”、“体积” 我已经为一种股票创建了

我的股票数据是.CSV(总共500个CSV)。我的目标是创建一个包含多个名为“a”、“B”的表的数据库,其中a和B指的是两种不同的股票。 我已经在数据库中加载了一个表,其中包含一个包含所有500个符号的列

我想迭代每一行,以便读取CSV并在数据库中为该股票创建一个表。例如,如果符号表中的第一行是“A”,则我希望通过读取名为“/path/A.csv”的csv文件在数据库中创建一个名为A的表

所有的表都有相同的结构。有四列“日期”、“打开”、“高”、“低”、“关闭”、“体积”

我已经为一种股票创建了一个表。例如,在股票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,这是可取的。我为单个目标表和多个源文件添加了一个示例。我正在通过你的例子来建立一个更好的理解,我相信一个单一的表格将是更可行的。