使用Excel宏(ADODB)在SQL Server 2008中创建临时表

使用Excel宏(ADODB)在SQL Server 2008中创建临时表,sql,sql-server-2008,vba,excel,Sql,Sql Server 2008,Vba,Excel,经过大量的谷歌搜索,我最终得到了以下宏,我希望它能连接到数据库,删除任何现有的临时表,然后创建一个新的临时表,填充它,并查看结果 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

经过大量的谷歌搜索,我最终得到了以下宏,我希望它能连接到数据库,删除任何现有的临时表,然后创建一个新的临时表,填充它,并查看结果

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
运行查询时,我收到以下错误消息:

运行时错误'-2147217887 80040e21':

无法支持请求的属性

NOCOUNT行和上面的大部分代码一样来自。我添加了IMEX=1以考虑订单号可能有多种类型,但我怀疑这就是问题所在


非常感谢您的帮助

我对临时表的理解是,它们只对创建它们的连接可用。在这种情况下,试图从另一个连接中删除一个连接是不明智的


错误消息没有说明是哪一行代码引起的。在这种情况下,我建议您逐段测试代码。从创建连接开始。然后打开并关闭它。然后在连接打开时开始执行操作,但每次只执行一项操作。

修改recodset的打开方式,将select从命令移动到recodset open方法调用

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)"

谢谢你的款待。你知道为什么我没有第一次尝试,而是这样做吗?Recodset需要知道它应该包含什么,所以你必须提供SQL代码。看看这里。有不同的方法可以打开记录集。祝您度过愉快的一天。在SQL Server中,临时表是一个全局临时表。通过在代码执行开始时尝试删除表,可以确保在创建已存在的表时,代码不会发出异常的竞争条件。最好的做法是在创建之前删除可能不存在的表。