将Access SQL查询转换为SqlServer

时间:2011-12-19 17:11:49

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

我已经完成了将DOZENS的访问表,查询,宏和报告转换为SQL Server的任务,以及到目前为止它的可怕性。

比如说:

SELECT [Numbers by Quarter and Bedsize].SizeCategory, 
[Numbers by Quarter and Bedsize].Bedsize, 
[Numbers by Quarter and Bedsize].[SumOfNumber of CLABSI], 
[Numbers by Quarter and Bedsize].[SumOfCentral Line Days],
 Round(1000*[Numbers by Quarter and Bedsize].[SumOfNumber of CLABSI]/[Numbers by Quarter and Bedsize].[SumOfCentral Line Days],2) AS [State CLABSI Rate], 
 [Numbers by Quarter and Bedsize].SummaryYQ
FROM [Numbers by Quarter and Bedsize]
ORDER BY [Numbers by Quarter and Bedsize].SizeCategory, [Numbers by Quarter and Bedsize].SummaryYQ;

虽然之前我见过SQL代码(主要是mysql),但我从来没有见过[Numbers by Quarter and Bedsize].SizeCategory

之类的东西

有没有很好的教程将Access SQL转换为SQLServer?请注意,在我的生活中,我实际上并没有触及Access或SqlServer。

2 个答案:

答案 0 :(得分:3)

  

我从来没有见过像[按季度和床位数]的数字.SizeCategory

这是点限定名称的示例。点左侧的元素是相关名称。如果未在from子句中提供显式相关名,则假定使用等于表名的默认相关名。例如

SELECT [Numbers by Quarter and Bedsize].SizeCategory
  FROM [Numbers by Quarter and Bedsize];

...实际上被解析为:

SELECT [Numbers by Quarter and Bedsize].SizeCategory
  FROM [Numbers by Quarter and Bedsize] AS [Numbers by Quarter and Bedsize];

你会看到相关名称被称为“别名”,这是不正确的,但遗憾地变成了白话。

可以说,它使代码更易于阅读,例如选择一个简短的相关名称。

SELECT n.SizeCategory
  FROM [Numbers by Quarter and Bedsize] AS n;

表名周围的方括号是带引号的标识符。在标准SQL中,带引号的标识符是双引号(")。 Access数据库引擎(ACE,Jet,等等)不符合SQL标准并使用方括号。 SQL Server可以使用标准和专有方括号作为带引号的标识符。

当数据元素不合法时,访问需要带引号的标识符,例如包含或以空格或非字母字符开头。 Access示例构建器事件倾向于在所有数据元素名称周围添加带引号的标识符,无论它们是否实际需要。

由于存在空格,表名Numbers by Quarter and Bedsize需要引号标识符。我建议你把端口作为重命名数据元素的机会。虽然可能需要进行完整的修订(我会质疑所选名称的一般质量),但一些“低悬的果实”将是用下划线替换空格字符的机会。

根据上述建议,并添加一些格式,查询将变为:

SELECT n.SizeCategory, 
       n.Bedsize, 
       n.SumOfNumber_of_CLABSI, 
       n.SumOfCentral_Line_Days,
       Round(1000 * n.SumOfNumber_of_CLABSI / n.SumOfCentral_Line_Days, 2) 
          AS State_CLABSI_Rate, 
       n.SummaryYQ
  FROM Numbers_by_Quarter_and_Bedsize AS n
  ORDER 
     BY SizeCategory, SummaryYQ;

显然,端口将涉及语法更改,但您还应该查找行为更改。例如,除非其中一个值的类型为FLOAT,否则Access SQL中的除法会生成DECIMAL,在这种情况下,结果为DECIMAL; SQL Server中的行为是不同的。您将面临的挑战之一是Access的文档非常差,例如关于除法的断言没有在Access帮助中说明,也没有在Microsoft的任何其他官方文档中说明;我必须通过反复试验来解决这个问题。

我建议您在Access和SQL Server中编写全面的测试,以确保移植的SQL不会导致更改的行为。

答案 1 :(得分:1)

你正在做的事情看起来不像是需要完全手工完成的事情......

您是否考虑过使用the free Microsoft SQL Server Migration Assistant (SSMA)从“访问MS SQL Server 2008”中“升迁”?