如何在sql server OpenRowset期间检查csv文件中是否存在列?

时间:2014-03-17 22:51:22

标签: sql sql-server csv

我遇到了一个非常棘手的问题,并且不确定是否有办法让它发挥作用。 基本上,我有用户上传了一个csv文件。第一行是标题。我需要检查此csv文件中是否存在列名。例如,我想知道该csv文件是否具有StudentName列。我该怎么做?

我尝试将文件导入临时表。一旦我把它放在临时表中,我就能得到我需要的一切。

select * into #temp 
from openrowset('Microsoft.ACE.OLEDB.12.0'
               , 'Text; Database='+@folder+'; HDR=NO; IMEX=1;'
               ,'select top 1 * from ' + @filename)

但这不起作用,因为openrowset不能包含变量。为了使它工作,我必须将这整个事件放入@sql变量然后执行它。

然而,这也行不通,因为如果我执行exec(@sql)我不能使用#temp,因为在exec(@sql)之后#temp将不可用。

任何其他方式让这项工作?

我希望有一些函数或存储过程如下:IsColumnExists(@directory,@ filename,@ colName)

感谢。

1 个答案:

答案 0 :(得分:0)

好问题。我从来没有必要这样做,但我可以看到它有多么有用。我在SQL 2012上测试了这个。

--We'll do this dynamically.  Change these values for your scenario.
--If you want to make this into a stored proc, these next two variables would be the sp input params.
DECLARE @Folder NVARCHAR(256) = 'D:\'   --Or other folder
DECLARE @FileName NVARCHAR(128) = 'Test.csv'  --Or other file.

--Temp table.  This will ultimately hold the names of the columns from the OPENROWSET query.
CREATE TABLE #ColNames (name SYSNAME)

--Build tsql string...
DECLARE @Tsql NVARCHAR(MAX) = '
    SELECT *
    INTO #Temp
    FROM OPENROWSET (           
        ''Microsoft.ACE.OLEDB.12.0'',   
        ''Text;Database=' + @Folder + ';HDR=YES'',   
        ''SELECT * FROM [' + @FileName + '] WHERE 1 = 2''  
    ) dt;

    SELECT name
    FROM tempdb.sys.columns 
    WHERE object_id = object_id(''tempdb..#Temp'')  
'
--...pass string to EXEC
INSERT INTO #ColNames
EXEC (@Tsql)

--Return a resultset of column names.
--Add additional logic to test for presence/absence of specific column.
SELECT *
FROM #ColNames

DROP TABLE #ColNames