2016-08-13 62 views
0

我可以創建動態SQL與參數@FilePath@WorksheetName以下查詢沒有創建臨時表之前嗎?我無法創建表格,因爲我不知道文件中的列數。參數化動態SQL與臨時表內

SELECT * 
INTO #OLD_REPORT 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0; 
       Database=C:\OLD_REPORT.xlsx;HDR=YES;IMEX=1', 
       'SELECT * FROM [Worksheet1$]') 

喜歡的東西

declare @sql varchar(2000) 
set @sql = 'SELECT ... INTO #OLD_REPORT ...' + @FilePath + '...' + @WorksheetName + '...' 
EXECUTE(@sql) 

不起作用,因爲#OLD_REPORT表(不能運行SELECT * FROM #OLD_REPORT

+3

您可以在動態查詢中使用'## OLD_REPORT'。 –

+0

爲什麼你不能選擇它?你會得到什麼錯誤? – gofr1

回答

0

你不能。如果你不知道從那個文件中可以得到什麼信息,SQL Server如何知道這些信息?

如果您在select語句中指定所有列名稱,則可以使用INTO語法來創建表。

我在想如何幫助你。
您可以嘗試使用CSV文件而不是Excel。然後,您將能夠在當時加載整行,然後您可以確定列數,列名和動態構建臨時表並將它們填充。

但是,在.NET中可能會更容易。

+0

我不同意。 您可以在不指定列名的情況下使用'SELECT * INTO #temp FROM Table'。 –

+0

我沒有說「當你做'SELECT INTO'時,你必須總是指定列'。如果你從現有的表中執行它,SQL已經知道它的列名。對? –

+0

如果從現有表中選擇SQL,則會知道列名稱。 無論如何,下面的查詢仍然有效,沒有指定列名稱,也不是從現有表格; 'SELECT * INTO #OLD_REPORT FROM OPENROWSET( 'Microsoft.ACE.OLEDB.12.0', \t \t \t \t「的Excel 12.0; \t \t \t \t數據庫= C:\ OLD_REPORT.xlsx; \t \t \t \t HDR = YES; \t \t \t \t IMEX = 1' , \t \t \t \t 'SELECT * FROM [表Sheet 1 $]')' –