VBA打开并运行.sql文件并将结果复制到excel中

时间:2018-02-26 14:47:20

标签: sql-server excel-vba vba excel

我对此有点新意,所以我提前为任何错误道歉。我试图打开并执行一个保存在C盘中的SQL查询。 sql工作正常。我没有写那个sql,它是一个非常大的文件,所以不想在VBA中添加代码。我一直在这个网站和其他地方搜索,但努力使这项工作。我每次都有一些或其他问题。我正在粘贴下面的代码,让你看看并帮助我。我已经在我的VBA代码中创建了这个函数。

Public Function ss()


'Open Connection
Dim oCon As ADODB.Connection
Set oCon = New ADODB.Connection

'Set Connection String
Dim sCon As String
sCon = "Provider=SQLOLEDB;Persist Security Info=True;User 
ID='*****';Password='*****';Initial Catalog=****;Data Source=*******;Use 
Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption 
for Data=False;Tag with column collation when possible=False"

oCon.Open sCon 'Connect established

'Create recordset
Dim ps As ADODB.Recordset
Set ps = New ADODB.Recordset

'Set & execute SQL Command
Dim pCMD As ADODB.Command
Set pCMD = New ADODB.Command
Set pCMD.ActiveConnection = oCon

Dim filename As String
filename = "C:\Users\???????????\******.sql"


'select data
pCMD.CommandText = 
CreateObject("scripting.filesystemobject").opentextfile(filename).ReadAll()
Set ps = pCMD.Execute(, , adCmdText)

Debug.Print ps.GetRows

If ps.EOF = False Then Sheets("Sheet2").Range("A1").CopyFromRecordset ps

'Close connection
Set ps = Nothing
Set pCMD = Nothing
oCon.Close
Set oCon = Nothing

End Function

Debug.Print仅用于查看结果,但它显示相同的错误"运行时错误' 3704'关闭对象时不允许操作。在尝试了这么多不同的事情后,我不确定我做错了什么。

有人可以帮忙吗?

任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:0)

对我来说,最简单的解决方案是修改存储过程的结束,以便在执行时将所有结果插入表中。下次执行SP时,您只需TRUCATE表格和INSERT新结果。

执行SP

您可以使用您在StackOverflow上找到的一些代码,使用VBA从Excel调用SP,例如以下内容(我从this回答):

Dim cnn As Object
Set cnn = CreateObject("ADODB.Connection")

Dim cmd As Object
Set cmd = CreateObject("ADODB.Command")
    cmd.CommandType = 1      ' adCmdText
    cmd.CommandTimeout = 120 ' number of seconds to time out

Dim ConnectionString As String
cnn.ConnectionString = "driver={SQL Server};server=MYSERVERNAME;Database=MYDATABASE;Trusted_Connection=yes;"
cnn.Open

Dim SQL As String
SQL = "EXEC [dbo].[Procedure_make_report] 'param1'"

cnn.Open
    cmd.CommandText = SQL
    cmd.ActiveConnection = cnn
    cmd.Execute

If Not cnn Is Nothing Then
    cnn.Close
    Set cnn = Nothing
End If

将结果导入Excel

既然SP的结果存储在您的DB表中,您可以使用ODBC连接将它们导入Excel,如herethis过程所示。