如何将 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