我遇到了一个非常棘手的问题,并且不确定是否有办法让它发挥作用。 基本上,我有用户上传了一个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)
感谢。
答案 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