2013-02-18 41 views
5

Sau rất nhiều Googling, tôi đã kết thúc với macro sau mà tôi hy vọng sẽ kết nối với cơ sở dữ liệu, thả bảng tạm thời hiện có và sau đó tạo cái mới (điền vào nó, và xem kết quả).Tạo bảng tạm thời trong SQL Server 2008 bằng cách sử dụng Excel Macro (ADODB)

Dim adoCn As ADODB.Connection 
Dim adoRs As ADODB.Recordset 
Dim adoCm As ADODB.Command 
Dim strSQL As String 

Set adoCn = New ADODB.Connection 
With adoCn 
    .ConnectionString = "Provider=SQLOLEDB;" & _ 
         "Initial_Catalog=XXX;" & _ 
         "Integrated Security=SSPI;" & _ 
         "Persist Security Info=True;" & _ 
         "Data Source=XXX;" & _ 
         "Extended Properties='IMEX=1'" 
    .CursorLocation = adUseServer 
    .Open 
End With 

Set adoCm = New ADODB.Command 

With adoCm 
    Set .ActiveConnection = adoCn 
    .CommandType = adCmdText 
    .CommandText = "IF OBJECT_ID('tempdb..#AgedProducts') IS NOT NULL DROP TABLE #AgedProducts" 
    .Execute 
    .CommandText = "CREATE TABLE #AgedProducts " & _ 
        "(Source_Order_Number VARCHAR(255)) " & _ 
        "INSERT INTO #AgedProducts VALUES ('AB-123-456') " & _ 
        "SELECT * FROM #AgedProducts (NOLOCK) " 
    .Execute 
End With 

Set adoRs = New ADODB.Recordset 
With adoRs 
    Set .ActiveConnection = adoCn 
    .LockType = adLockBatchOptimistic 
    .CursorLocation = adUseServer 
    .CursorType = adOpenForwardOnly 
    .Open "SET NOCOUNT ON" 
End With 
adoRs.Open adoCm 

MsgBox "Recordset returned...", vbOKOnly 

While Not adoRs.EOF 
    Debug.Print adoRs.Fields(0).Value 
    adoRs.MoveNext 
Wend 

adoCn.Close 

Set adoCn = Nothing 
Set adoRs = Nothing 

Khi tôi chạy truy vấn tôi nhận được thông báo lỗi sau:

Run-time error '-2147217887 (80040e21)':

The requested properties cannot be supported

Dòng NOCOUNT đến từ http://support.microsoft.com/kb/235340 (cũng như hầu hết các mã trên). Tôi đã thêm IMEX=1 để đưa vào số thứ tự tài khoản có thể có nhiều loại trong đó nhưng tôi nghi ngờ đó là nơi xảy ra sự cố.

Bất kỳ trợ giúp nào được đánh giá cao!

Trả lời

5

Sửa cách cách mở recodset, di chuyển lựa chọn từ lệnh này sang lệnh gọi phương thức mở recodset.

With adoCm 
    Set .ActiveConnection = adoCn 
    .CommandType = adCmdText 
    .CommandText = "IF OBJECT_ID('tempdb..#AgedProducts') IS NOT NULL DROP TABLE #AgedProducts" 
    .Execute 
    .CommandText = "CREATE TABLE #AgedProducts " & _ 
        "(Source_Order_Number VARCHAR(255)) " & _ 
        "INSERT INTO #AgedProducts VALUES ('AB-123-456') " 
    .Execute 
End With 

Set adoRs = New ADODB.Recordset 
With adoRs 
    Set .ActiveConnection = adoCn 
    .LockType = adLockBatchOptimistic 
    .CursorLocation = adUseServer 
    .CursorType = adOpenForwardOnly 

End With 
adoRs.Open "SELECT * FROM #AgedProducts (NOLOCK)" 
+0

Cảm ơn điều này - làm việc một điều trị. Bạn có biết tại sao điều này hoạt động thay vì nỗ lực đầu tiên của tôi? –

+1

Recodset cần biết những gì cần có trong nó, vì vậy bạn phải cung cấp mã SQL. Có một cái nhìn, ví dụ tại đây http://support.microsoft.com/kb/168336. Có nhiều phương pháp khác nhau làm thế nào để mở recodset. Chúc một ngày tốt lành. – dee

0

Sự hiểu biết của tôi về bảng tạm thời là chúng chỉ có sẵn cho kết nối đã tạo chúng. Đó là trường hợp, cố gắng để thả một từ kết nối khác là không khôn ngoan.

Thông báo lỗi không nêu rõ dòng mã nào gây ra lỗi đó. Trong trường hợp đó, tôi khuyên bạn nên kiểm tra từng phần của mã. Bắt đầu bằng cách tạo kết nối. Sau đó mở và đóng nó lại. Sau đó, bắt đầu làm mọi thứ trong khi kết nối được mở, nhưng một điều tại một thời điểm.

+0

Trong SQL Server ## temp_table là bảng tạm thời toàn cầu. Bằng cách cố gắng để thả bảng khi bắt đầu thực thi mã đảm bảo (điều kiện chủng tộc sang một bên) rằng mã không bawk khi cố gắng tạo ra một bảng đã tồn tại. Cách tốt nhất là thả bảng (có thể không tồn tại) trước khi tạo bảng. – Robino

Các vấn đề liên quan