我正在使用SQL Server迁移助手来创建链接表,以从Access链接到SQL Server。在迁移过程中,我还选择了Access查询以及要迁移的表。现在,表已迁移并链接。没有选项可以自动链接查询。但是,在我的15个查询中,只有5个已迁移。 SSMA文档说:
大多数SELECT查询都转换为视图。其他查询,例如 UPDATE查询不会迁移。
采用参数的SELECT查询不会转换,也不会转换 交叉表查询。
将访问查询转换为SQL视图时,最好的做法是什么,因为它不是自动完成的?我知道视图必须在T-SQL中。
答案 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