簡體   English   中英

SQL服務器不使用OLEDB將Excel數據導入臨時表

[英]Import Excel Data Into Temporary Table Without Using OLEDB in SQL Server

我正在嘗試尋找一種在不使用 OLEDB 的情況下將 excel 數據導入臨時表的方法,因為我沒有在 SQL 服務器中安裝 OLEDB,並且由於安全限制,我無法安裝它。 我知道下面提到的方法,但這對我沒有幫助

Begin Tran
If OBJECT_ID('tempdb..#tblUserImport') IS NOT NULL
Begin
Drop table #tblUserImport
end
Create Table [dbo].[#tblUserImport]
(
id nvarchar(max) NULL,
Name nvarchar(max) NULL,
Job_Title nvarchar(max) NULL,
Work_Email nvarchar(max) NULL
)
INSERT  INTO [dbo].[#tblUserImport]
SELECT  id, Name, Job Title, Work Email
FROM
OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel12.0;HDR=YES;Database=C:\Users\Desktop\Book2.xlsx', 'SELECT * FROM [Sheet1$]');
select * from [#tblUserImport]
Rollback Tran

如果我執行 openrowset,我會得到下面提到的錯誤。

OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”尚未注冊。

是否可以使用存儲過程或任何其他方式來實現它?

使用表變量的超級mcguyver方式。 使用Excel工作表上的concat函數為插入部件准備數據。

declare @temp1 table (id int identity(1,1),name varchar(255),job_title varchar(255),work_title varchar(255),work_email varchar(255));
insert into @temp1 (name,job_title,work_title,work_email)
values
('John','Electrician','level 3 lightning wizard','john@ex.com'),
('amy','Java Developer','Cyber Coffee Slinger','amy@ex.com');

這里有3個選項:

1. 從具有管理員權限的計算機導入

聽起來您無法在SQL Server計算機上安裝OLE或ODBC數據提供程序。 但您不必從同一台計算機上運行導入。 只要您具有有效的憑據和SQL服務器的工作網絡路徑,就可以從任何計算機運行導入。 因此,您可以在另一台PC上安裝Microsoft ACE OLEDB 12.0數據提供程序驅動程序以及SQL Server Management Studio,在那里復制Excel文件,然后通過向導進行導入。

  1. 嘗試備用數據提供程序驅動程序

可能已在您的環境中安裝Excel源的備用數據提供程序驅動程序。 例如, https: //www.connectionstrings.com/excel/上提到的Jet OLEDB 4.0驅動程序。 連接字符串:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;
Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";
  1. 使用Excel公式來構建INSERT語句

您可以使用RBell答案中提到的令人尊敬的Excel公式技巧:假設您在問題中指定的字段在A1到D1中,請將此公式添加到單元格E1:

="INSERT INTO #tblUserImport VALUES ('"&SUBSTITUTE(A1, "'", "''")&"', '"&SUBSTITUTE(B1, "'", "''")&"', '"&SUBSTITUTE(C1, "'", "''")&"', '"&SUBSTITUTE(D1, "'", "''")&"');"

然后,將此公式向下復制到數據的所有行。 Excel將自動更改每行的單元格引用。 請注意, SUBSTITUTE()函數處理數據中的單引號,否則可能會破壞SQL語法。 然后,您只需將生成的文本復制並粘貼到SQL窗口中,然后運行它。

它的工作量很大,但可行

我假設您對 prod db 具有只讀訪問權限,可以創建臨時表並插入臨時表語句。 無法訪問 sql 向導或任何提升的權限。

下面 4 個步驟,我們必須在我們的開發 sql 框中進行預成型。 然后生成 create #temptable 腳本和自動生成的插入語句並在生產臨時數據庫中運行它們

  1. 將 excel 作為 csv 文件保存到開發機器
  2. 創建一個#temptable/ ##temptable(因為通常開發人員在生產數據庫中沒有創建表的權限) 注意:如果表有更多列,請使用向導生成自動創建表語句。 如何? 答案是:右鍵單擊數據庫 --> 任務 --> 導入數據 --> sql 服務器導入和導出向導,select 數據源作為平面文件源並瀏覽您在步驟中創建的 csv 文件。 --> Next --> on the choose a destination select destination as sql server native client 11.0 --> next --> on select source table and views screen choose edit mappings --> on column mappings screen click edit sql button which gives自動生成的創建表語句。

復制自動生成的腳本 --> 將名稱編輯為 ##TempTable_CSV --> 創建臨時表。

  1. 現在桌子准備好了。 對於數據,通過提供 csv 路徑 BULK INSERT ##TempTable_CSV FROM 'C:\Users<username>\Downloads\temp.csv' WITH (FIRSTROW = 2, FORMAT = 'CSV') 使用批量插入;

  2. 從臨時表自動生成插入語句(例如假設臨時表有 id、varchar 列) select 'insert ##TempTable_CSV values ('+Cast(Id as varchar(5))+','''+SomeVarcharColumn+ ''') 來自 ##TempTable_CSV

這將生成所有插入語句注意:確保處理 null 值

最后,您可以復制步驟 2 中的創建臨時表腳本 + 步驟 4 中自動生成的插入語句,在 prod temp db 中運行它。

享受:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM