如何将 Access 查询迁移到 SQL 视图?

Posted

技术标签:

【中文标题】如何将 Access 查询迁移到 SQL 视图?【英文标题】:How to migrate Access queries to SQL views? 【发布时间】:2018-12-20 10:53:29 【问题描述】:

我正在使用 SQL Server 迁移助手创建链接表以从 Access 链接到 SQL Server。在迁移过程中,我还选择了 Access 查询以及要迁移的表。这些表现在已迁移和链接。没有自动链接查询的选项。但是,在我的 15 个查询中,只有 5 个已迁移。 SSMA 文档说:

大多数 SELECT 查询都转换为视图。其他查询,例如 UPDATE 查询,不会迁移。

带有参数的 SELECT 查询不会被转换,也不会 交叉表查询。

将 Access 查询转换为 SQL 视图时,最好的做法是什么,因为它不是自动完成的?我知道视图需要在 T-SQL 中。

【问题讨论】:

您需要迁移多少查询? 所有 15 个查询 那最好手动重写。好的提示:weblogs.sqlteam.com/jeffs/2007/03/30/… 只有 15 个查询可以手动迁移,正如 @4dmonster 所写。 【参考方案1】:

作为迁移到sql server 的一般规则,访问客户端的select 查询不应该迁移到sql server。正如您所指出的,只能迁移选择的查询,更糟糕的是,这些视图在链接时将变为只读。 (除非您在迁移过程中选择了 PK) 迁移数据并链接到这些表后,所有现有的 Access 查询将继续像以前一样工作。

这些 Access 保存的查询将继续像以前一样工作,它们现在正在使用链接表工作。大多数访问请求不需要转换,它们在不转换的情况下表现得相当好。

唯一的例外是那些具有say-by或复杂连接的复杂查询应该被转换。

在大多数情况下,访问客户端查询不会拉取整个 sql server 表,所以再一次,迁移访问客户端查询几乎没有好处。我不会迁移它们。

如果我们有

从 InvoiceNum = 1234 的 tblInvoies 中选择 *

上面不需要转成t-sql,也不需要转成view。将此类选择查询转换为 sql 视图访问可能会在您的应用程序中引入错误和问题。

如上所述,sql server 不能像 Access 查询那样“提示”您。

对于那些运行缓慢的查询,您只需要或想要将访问查询转换为 sql 视图。

我不会将任何访问查询迁移到 sql server。您最好继续使用保存的 Access 查询客户端。他们中的大多数人不会通过转换为 t-sql 视图来提高性能。

而且您可能会引入大量错误和问题,这些问题会破坏您的应用程序。

仅迁移数据表。让客户端应用程序尽快运行,然后考虑调整或迁移一些性能不佳的访问查询。在一个有 200 个客户端查询的应用程序中,我发现只有 5-10 个需要转换为视图。

【讨论】:

【参考方案2】:

SQL Server 绝对支持 Pivots;您必须将交叉表重新创建为 Pivots。 SQL Server 绝对支持参数查询。只需重新编写SQL。根据查询的复杂程度,您可能只需从 Access 复制 SQL 并将其粘贴到 SQL Server 中。您儿子并没有真正将查询保存在 SQL Server 中(尽管您可以导出它们),但是您将查询作为存储过程运行。这需要一点时间来适应,但是一旦您从 Access 中切换出来,我很确定您将永远不会回头。

【讨论】:

对于报告、代码和表单的 150,000 美元以上的投资?在 99.9% 的迁移情况下,如何从 Access 切换到 sql server?我从来没有见过一个迁移,其中作为前端客户端的 Access 可以被删除。而且我从来没有见过一个访问应用程序,即使在迁移之后您也可以使用 sql 管理器来替换报告和表单。所以它引出了一个问题,回到什么?您将数据迁移与应用程序迁移混淆了。用户实际上提到了提示输入的查询。 sql server如何提示输入? 但是,要公平吗?好吧,您从未建议转储访问权限。我一直在使用带有 Access 的 SQL 服务器——是的,我几乎不会再回到访问后端——但你评论从来没有真正暗示过不能继续使用 Access 作为前端。所以平心而论,你只是真的建议使用 SQL 服务器作为数据库——我同意!【参考方案3】:

我帮助开发了一个将 Access SQL 查询转换为 T-SQL 的网站。粘贴到您的 Access SQL 中,它会将结果转换并格式化为 T-SQL。在 SSMS 或 Access 直通查询中测试生成的查询。

https://accessusergroups.org/sql-converter/

该网站对粘贴的查询应用了 80 多次转化。它可以处理很多特定于 Access 的语法。

SELECT Instr("Please send feedback & share with friends","e") as Last_E
    ,DATE() AS Today_Date
    ,NOW() AS Today_Now
    ,CDate(DateUpdate) AS DateUpdate_CDate
    ,CCur([flags]) AS Flags_CCur
    ,NZ([LV], "LV NULL") AS LV_NZ
    ,CInt([Type]) AS Type_CInt
    ,CSng([MsysObjects.DateCreate]) AS DateCreate_CSng
    ,CDbl([MsysObjects].[DateCreate]) AS DateCreate_CDbl
    ,TRIM(SPACE(20) & NAME & " ") AS Name_Trim
    ,LEFT(NAME, 4) AS Name_Left4
    ,RIGHT(NAME, 4) AS Name_Right4
    ,MID(NAME, 4,5) AS Name_Mid45
    ,NOT INSTR(1, NAME, "q") <> 0 AS Name_Contains_q
    ,IIF(Type = 5, "Query", "Other") AS Type_IIF
    ,IIF(ISNULL(LvProp), "N/A", LvProp) AS LvProp_Handler
    ,"Amy's code IS righteous." AS SingleQuotes
    ,"Al's ""new"" cars" AS DoubleQuotes
    ,"10 + 10 = "& CStr(10 * 2) AS IgnoreMathSymbols
,DCOUNT("Name","MsysObjects","Name like Q*") as RowCount
FROM MsysObjects
WHERE [NAME] LIKE "*e*"
    AND RIGHT(DATE(), 4) = 1010 * 2 + 1

上面的 Access 查询将转换为 T-SQL,如下所示。请记住,SQL Server 中不存在 MsysObjects 表。

SELECT CHARINDEX('e', 'Please send feedback & share with friends' ) as Last_E 
    ,CONVERT(date, GETDATE()) AS Today_Date 
    ,GETDATE() AS Today_Now 
    ,CONVERT(date,DateUpdate) AS DateUpdate_CDate 
    ,CONVERT(money,[flags]) AS Flags_CCur 
    ,ISNULL([LV], 'LV NULL') AS LV_NZ 
    ,CONVERT(int,[Type]) AS Type_CInt 
    ,CONVERT(real,[MsysObjects].[DateCreate]) AS DateCreate_CSng 
    ,CONVERT(real,[MsysObjects].[DateCreate]) AS DateCreate_CDbl 
    ,TRIM(SPACE(20) + NAME + ' ') AS Name_Trim 
    ,LEFT(NAME, 4) AS Name_Left4 
    ,RIGHT(NAME, 4) AS Name_Right4 
    ,SUBSTRING(NAME, 4,5) AS Name_Mid45 
    ,NOT CHARINDEX('q', NAME ,1) <> 0 AS Name_Contains_q 
    ,IIF(Type = 5, 'Query', 'Other') AS Type_IIF 
    ,IIF((LvProp IS NULL) , 'N/A', LvProp) AS LvProp_Handler 
    ,'Amy''s code IS righteous.' AS SingleQuotes 
    ,'Al''s "new" cars' AS DoubleQuotes 
    ,'10 + 10 = '+ CStr(10 * 2) AS IgnoreMathSymbols 
    ,
/* DCOUNT beta conversion */ (
SELECT COUNT(Name) 
FROM MsysObjects 
WHERE Name LIKE Q% 
) as RowCount 
FROM MsysObjects 
WHERE [NAME] LIKE '%e%' 
    AND RIGHT(CONVERT(date, GETDATE()) , 4) = 1010 * 2 + 1

【讨论】:

以上是关于如何将 Access 查询迁移到 SQL 视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何将共享数据库从 Access 迁移到 SQL Express

从 Access 迁移到 SQL Server 数据库

从 SQL Server 2008 迁移到 MS access 2007

如何将两个List合并,且其中不允许出现重复的项

如何在access中执行sql语句

数据库:在 MS Access DB 和 MYSQL 之间迁移数据