Преобразование SQL-запросов на доступ к SqlServer - PullRequest
2 голосов
/ 19 декабря 2011

Мне было поручено преобразовать Десятки таблиц доступа, запросов, макросов и отчетов в 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 ]

3 голосов
/ 20 декабря 2011

Я никогда не видел ничего подобного [Числа по кварталам и по размеру] .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;

Очевидно, порт будет связан с изменениями синтаксиса, но вы также должны искать изменения в поведении. Например, деление в Access SQL приводит к FLOAT, если только одно из значений не имеет тип DECIMAL, и в этом случае результат равен DECIMAL; поведение в SQL Server отличается. Одна из проблем, с которой вы столкнетесь, - это крайне скудная документация для Access, например утверждение, которое я только что сделал о разделении, не указано ни в справке Access, ни в какой-либо другой официальной документации от Microsoft; Я должен был понять это для себя методом проб и ошибок.

Я рекомендую вам написать всесторонние тесты как в Access, так и в SQL Server, чтобы убедиться, что ваш перенесенный SQL не приведет к изменению поведения.

1 голос
/ 19 декабря 2011

То, что вы делаете, не похоже на то, что нужно делать полностью вручную ...

Рассматривали ли вы использование бесплатного Microsoft SQL Server Migration Assistant (SSMA) для "увеличения размера" с Access на MS SQL Server 2008?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...