使用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中,临时表是一个全局临时表。通过在代码执行开始时尝试删除表,可以确保在创建已存在的表时,代码不会发出异常的竞争条件。最好的做法是在创建之前删除可能不存在的表。