使用excel中的范围作为条件的SQL查询

时间:2015-07-09 11:47:18

标签: sql-server excel vba excel-vba

我使用excel中的SQL查询中的外部数据将数据提取到电子表格中,然后将电子表格发送到我的某个大学,比如销售部门,他们可以查看查询的信息。
我希望能够有一个可以输入数据的单元格并按下刷新按钮。

所以我需要做一些这样的事情:

SELECT     Customer.CustomerCode, Customer.Name, 
           OrderHeader.OrderType, OrderHeader.OrderNumber
FROM       Customer INNER JOIN
           OrderHeader ON Customer.CustomerID = OrderHeader.CustomerID
WHERE     (OrderHeader.OrderType = 2) AND (OrderHeader.OrderNumber = Range("A1").Value)  

不确定这是否可行以及我需要这样做的原因是因为我要通过所有行情中的行,如果超过65536那么我就会遇到问题。

这就是我目前的SQL不同但但并不重要的事情

enter image description here

2 个答案:

答案 0 :(得分:1)

最简单的方法是将参数的值拉入VBA,然后将SQL语句创建为带有参数值的字符串,然后填充查询的commandtext。

以下是单元格A1中参数的基本示例。

Sub RefreshQuery()

Dim OrderNo As String
Dim Sql As String

' Gets value from A1
OrderNo = Sheets("Sheet1").Range("A1").Value

'Creates SQL Statement
Sql = "SELECT     Customer.CustomerCode, Customer.Name, " & _
    "OrderHeader.OrderType , OrderHeader.OrderNumber " & _
    "FROM       Customer " & _
    "INNER Join  OrderHeader ON Customer.CustomerID = OrderHeader.CustomerID " & _
    "WHERE (OrderHeader.OrderType = 2) And (OrderHeader.OrderNumber = " & OrderNo & ") "


With ActiveWorkbook.Connections(1).ODBCConnection
    .CommandText = Sql
    .Refresh
End With

End Sub

这假设您在Excel中开始查询,并且它是唯一的查询。否则,您必须按如下方式定义查询名称:

With ActiveWorkbook.Connections("SalesQuery").ODBCConnection

我希望有帮助:)

答案 1 :(得分:1)

除了使用ODBC的@ OWSam示例之外,我们还可以使用ADO从SQL Server中提取查询结果。使用ADO,您无法使用Windows验证,您将需要用户以某种方式输入其密码,以便能够运行查询。

我个人创建了一个具有UserName和Password的用户表单。使用Environ预先填充的用户名,然后他们可以在相关的TextBox中键入他们的密码。

Sub sqlQuery()
    Dim rsConn As ADODB.Connection, rsData As ADODB.Recordset
    Dim strSQL As String, winUserName As String, pwd As String

    winUserName = UCase(Environ("username"))
    pwd = "mypassword" 'password needed here.
    strSQL = "SELECT * FROM mydatabase" 'query

    Set rsConn = New ADODB.Connection
    With rsConn
        .ConnectionString = "Provider = sqloledb;" & _
                            "Data Source = [server name here];" & _
                            "Initial Catalog = [initial database];" & _
                            "Integrated Security=SSPI;" & _
                            "User ID = " & winUserName & ";" & _
                            "Password = " & pwd & ";"
        .Open
    End With
    Set rsData = rsConn.Execute(strSQL)

    Range("A1").CopyFromRecordset rsData
End Sub

编辑:您必须进入引用并打开Microsoft ActiveX Data Objects Recordset 6.0库(或VBE中的等效文件)。