【问题标题】:Convert logic in a dynamic query from Access VBA to SQL Server view将动态查询中的逻辑从 Access VBA 转换为 SQL Server 视图
【发布时间】:2016-04-26 14:03:18
【问题描述】:

我正在将 Access 应用程序转换为 Web 应用程序,但我无法将此 vb/SQL 转换为视图。这似乎不是那么难的问题,但它真的让我陷入困境。

Public Function GetProjectNumber(ByVal HeaderID As Long) As String
    Dim retval As String
    Dim rst As New ADODB.Recordset
    Dim tempID As Long

On Error GoTo Err_Handler

    rst.Open "SELECT TransferID, ProjectID FROM dbo.tblProject WHERE HeaderID = " & HeaderID
    If Not (rst.EOF And rst.BOF) Then
        If IsNull(rst!TransferID) Then
            retval = rst!ProjectID
        Else
            tempID = rst!TransferID
            If rst.State = adStateOpen Then rst.Close
            rst.Open "SELECT ProjectID FROM dbo.tblProject WHERE HeaderID = " & tempID
            If rst.EOF And rst.BOF Then
                retval = "Transfer from ????"
            Else
                retval = "Transfer from " & rst!ProjectID
            End If
        End If
    End If

If rst.State = adStateOpen Then rst.Close

Exit_Handler:
    Set rst = Nothing
    GetProjectNumber = retval
    Exit Function

End Function

我尝试使用嵌套的case 语句,但不能将案例应用于返回的每一行。有没有办法用IIF 做到这一点?还是让它成为一个函数?

【问题讨论】:

  • 使用 SQLserver 的导入工具将 MSAccess DB 导入 SQLserver 不是更简单吗?
  • 它不是 Access 数据库,它是访问 SQL 2012 数据库的 Access 前端。我正在尝试将前端重写为 Web 应用程序,但需要在 Access 中进行任何 SQL 调用并将它们移动到存储过程/视图。
  • 无论您需要阅读、理解并开始使用参数化查询的解决方案。建立字符串并直接针对您的服务器执行它们是对 bobby 表访问的公开邀请。 bobby-tables.com

标签: sql sql-server vba ms-access


【解决方案1】:

以下查询为表中的所有记录(即所有 HeaderID)模仿您的代码。

SELECT P1.HeaderID,
(CASE 
    WHEN P1.TransferID IS NULL THEN P1.ProjectID
    WHEN P2.ProjectID IS NULL THEN 'Transfer from ???' 
    ELSE "Transfer from " + P2.ProjectID
 END) AS Returns
FROM dbo.tblProject P1
LEFT JOIN dbo.tblProject P2 ON P1.TransferID = P2.HeaderID 

如果您从中创建 SQL 服务器视图,则可以使用特定的 HeaderID 轻松查询它,就像您在 VBA 子中所做的那样

SELECT Returns FROM the_view WHERE HeaderID='xxxxx'

它应该返回与您的过程完全相同的结果

【讨论】:

  • 这个答案解决了关键问题:编写基于集合的代码。基于集合的代码意味着在列中思考。在 COLUMNS 中思考与 SQL 一致。在 ROWS 中思考会使您与 SQL 不一致,使您的工作受挫。如果您可以使用纯 SQL 来替换 VBA 记录集的逐行处理(即使在 Access 中),那么您的方向是正确的。
  • 现在看到它比执行像 vba 这样的逐行操作更有意义。不幸的是,我正在使用由许多人编写的 20 多年的代码,而这只是需要翻译的“主查询”的 14 个函数中的一个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多