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

时间:2018-12-20 10:53:29

标签: sql-server ms-access access-vba

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

  

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

     

采用参数的SELECT查询不会转换,也不会转换   交叉表查询。

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

3 个答案:

答案 0 :(得分:1)

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

那些已保存Access的查询将继续像以前一样工作,并且现在正使用链接表来工作。大多数访问需求不需要进行转换,并且无需转换即可表现良好。

唯一的例外是那些带有“分组依据”或复杂联接的复杂查询。

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

如果我们有

从tblInvoies中选择*,其中InvoiceNum = 1234

以上内容不需要转换为t-sql,也不需要转换为视图。在访问sql视图的过程中转换此类select可能会在您的应用程序中引入错误和问题。

并且如前所述,sql server无法像Access查询那样“提示”您。

对于那些运行缓慢的查询,您只需要或希望隐蔽对sql视图的访问查询。

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

您可能会引入大量错误,并且可能会破坏您的应用程序。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

注意:我知道这个答案可能违反了 SO 的规则,但在版主报告此消息之前,请考虑没有我可以分享的直接算法来回答这个问题。该网站对粘贴的查询应用了 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