2013-02-18 13 views
5

का उपयोग कर SQL सर्वर 2008 में एक temp तालिका बनाना, बहुत सारे गूगलिंग के बाद, मैंने निम्न मैक्रो के साथ समाप्त कर दिया है, जिसे मैं उम्मीद करता हूं कि डेटाबेस से कनेक्ट होगा, किसी भी मौजूदा temp तालिका को छोड़ दें और फिर एक बनाएं नया एक (इसे पॉप्युलेट करें, और परिणाम देखें)।एक्सेल मैक्रो (एडीओडीबी)

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 

जब मैं क्वेरी मैं निम्नलिखित त्रुटि संदेश प्राप्त चलाएँ: (जैसा कि ऊपर कोड के बहुत करता है)

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

The requested properties cannot be supported

NOCOUNT लाइन http://support.microsoft.com/kb/235340 से आता है। मैंने IMEX=1 को खाता क्रम संख्या में लेने के लिए जोड़ा है, लेकिन मुझे संदेह है कि समस्या कहां हो रही है।

किसी भी मदद की बहुत सराहना की जाती है!

उत्तर

5

पुन: प्रारंभ करने के तरीके को संशोधित करें, आदेश से चयन को रिकोडसेट ओपन विधि कॉल में ले जाएं।

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

इसके लिए धन्यवाद - एक इलाज करता है। क्या आप जानते हैं कि यह मेरे पहले प्रयास के बजाय क्यों काम करता है? –

+1

रिकोडसेट को यह जानने की आवश्यकता है कि इसमें क्या होना चाहिए, इसलिए आपको SQL कोड प्रदान करना होगा। एक नज़र डालें यहां http://support.microsoft.com/kb/168336। रिकोडसेट को खोलने के तरीके अलग-अलग तरीके हैं। आपका दिन शुभ हो। – dee

0

temp तालिकाओं की मेरी समझ यह है कि वे केवल उन कनेक्शन के लिए उपलब्ध हैं जो उन्हें बनाए गए हैं। यह मामला है, किसी दूसरे कनेक्शन से ड्रॉप करने का प्रयास मूर्खतापूर्ण है।

त्रुटि संदेश यह नहीं बताता कि कोड की कौन सी रेखा ने इसका कारण बनाया है। यह मामला है, मेरा सुझाव है कि आप अपने कोड टुकड़े टुकड़े का परीक्षण करें। कनेक्शन बनाकर शुरू करें। फिर इसे खोलें और बंद करें। फिर कनेक्शन खोलने के दौरान चीजें करना शुरू करें, लेकिन एक समय में एक चीज।

+0

SQL सर्वर ## temp_table में एक वैश्विक अस्थायी तालिका है। कोड निष्पादन की शुरुआत में तालिका को छोड़ने का प्रयास करके (दौड़-शर्तों को अलग-अलग) सुनिश्चित करता है कि कोड पहले से मौजूद तालिका बनाने की कोशिश करते समय बाक नहीं करता है। इसे बनाने से पहले (शायद अस्तित्वहीन) तालिका को छोड़ना सबसे अच्छा अभ्यास है। – Robino

संबंधित मुद्दे