【发布时间】:2017-03-09 04:13:58
【问题描述】:
我正在尝试自动化将 CSV 文件批量导入 sql-server 的过程,到目前为止我有这个:
----Allow for SQL to use cmd shell
--EXEC sp_configure 'show advanced options', 1 -- To allow advanced options to be changed.
--RECONFIGURE -- To update the currently configured value for advanced options.
--EXEC sp_configure 'xp_cmdshell', 1 -- To enable the feature.
--RECONFIGURE -- To update the currently configured value for this feature.
SET NOCOUNT ON
--Loop through all of the files
CREATE TABLE #tmp(excelFileName VARCHAR(100));
CREATE TABLE #tmpCol(col NVARCHAR(MAX));
INSERT INTO #tmp
EXEC xp_cmdshell 'dir /B "C:\Users\owain.esau\OneDrive\Work\Companies\IronSude\backupFiles\"';
DECLARE @fileName varchar(100)
DECLARE @tableName varchar(MAX)
DECLARE @sql varchar(MAX)
While (Select Count(*) From #tmp where excelFileName is not null) > 0
Begin
Select Top 1 @fileName = excelFileName From #tmp
SET @sql = 'BULK INSERT #tmpCol FROM "C:\Users\owain.esau\OneDrive\Work\Companies\IronSide\backupFiles\' + @filename + '" WITH (ROWTERMINATOR = '','', LASTROW = 1)'
EXEC (@sql)
UPDATE #tmpCol SET col = REPLACE(col, '"', '')
UPDATE #tmpCol SET col = REPLACE(col, ' ', '')
SET @tableName = LEFT(@filename, LEN(@filename) -4)
CREATE TABLE @tableNAme ( )
Delete from #tmp Where excelFileName = @FileName
End
DROP TABLE #tmp
DROP TABLE #tmpCol
@sql 批量插入根据需要获取列标题,但我不知道如何将其实际传递到 CREATE TABLE 语句中。
任何帮助将不胜感激!
-- 编辑 ----------------------------------------- ----------
在将 CREATE TABLE 更改为使用动态 SQL 后,我得到以下结果(我也将其放入循环中):
----Allow for SQL to use cmd shell
--EXEC sp_configure 'show advanced options', 1 -- To allow advanced options to be changed.
--RECONFIGURE -- To update the currently configured value for advanced options.
--EXEC sp_configure 'xp_cmdshell', 1 -- To enable the feature.
--RECONFIGURE -- To update the currently configured value for this feature.
SET NOCOUNT ON
--Loop through all of the files
CREATE TABLE #tmp(excelFileName VARCHAR(100));
CREATE TABLE #tmpCol(col NVARCHAR(MAX));
INSERT INTO #tmp
EXEC xp_cmdshell 'dir /B "C:\Users\owain.esau\OneDrive\Work\Companies\IronSude\backupFiles\"';
DECLARE @fileName varchar(100)
DECLARE @tableName varchar(MAX)
DECLARE @colName varchar(MAX)
DECLARE @sql varchar(MAX)
DECLARE @sql2 varchar(max)
While (Select Count(*) From #tmp where excelFileName is not null) > 0
Begin
Select Top 1 @fileName = excelFileName From #tmp
SET @sql = 'BULK INSERT #tmpCol FROM "C:\Users\owain.esau\OneDrive\Work\Companies\IronSude\backupFiles\' + @filename + '" WITH (ROWTERMINATOR = '','', LASTROW = 1)'
EXEC (@sql)
UPDATE #tmpCol SET col = REPLACE(col, '"', '')
UPDATE #tmpCol SET col = REPLACE(col, ' ', '')
WHILE (SELECT COUNT(*) FROM #tmpCol WHERE col IS NOT NULL) > 0
BEGIN
Select Top 1 @colName = col From #tmpCol
SET @tableName = LEFT(@filename, LEN(@filename) - 5)
SET @sql2 = 'CREATE TABLE [' + @tableName + ']('
SELECT @sql2 = @sql2 + '[' + col + '],' FROM #tmpCol
SET @sql2 = SUBSTRING(@sql2,1,LEN(@sql2) -1) + 'NVARCHAR(MAX)) '
EXEC(@sql2)
DELETE FROM #tmpCol WHERE col = @colName
END
Delete from #tmp Where excelFileName = @FileName
End
DROP TABLE #tmp
DROP TABLE #tmpCol
问题是,是第一个动态SQL查询:
SET @sql = 'BULK INSERT #tmpCol FROM "C:\Users\owain.esau\OneDrive\Work\Companies\IronSude\backupFiles\' + @filename + '" WITH (ROWTERMINATOR = '','', LASTROW = 1)'
由于最后一行设置为 1 且行终止符为 ',' 它只拾取一列。如果我将 RowTerminator 更改为 '\n' 它会将其全部放在一行中,例如:
"Attachment Id","Attachment Owner Id","Modified By","Created By","Created Time","Modified Time","File Name",Size,"Parent Id","Attachment Type",Documents
无论如何我可以设置 LASTROW = '\n' 的第一个实例吗?
【问题讨论】:
-
嗨,@OwainEsau 检查我的回答是否正确理解了您的问题
标签: sql sql-server tsql