При переходе из MS SQL в MySQL, кроме миграции данных, вы должны также перенести код приложения, который находится в базе данных.
Ранее мы обсуждали, как перенести MS SQL в базу данных MySQL с помощью инструмента WorkSQL Workbench.
В рамках миграции, он будет только конвертировать таблицы и копировать данные, но он не будет преобразовывать триггеры, представления и хранимые процедуры. Вы должны вручную преобразовать их в базе данных MySQL.
Для выполнения этого преобразования вручную, вы должны понимать основные различия между запросами MS SQL и MySQL.
Во время моего преобразования из Microsoft SQL Server в базу данных MySQL, я столкнулся со следующими операторами и запросами MS SQL, которые не были совместимы с MySQL, и я должен был преобразовать их, как показано ниже.
Основной синтаксис создания хранимых процедур отличается.
MS SQL Stored, синтаксис создания процедуры:
CREATE PROCEDURE [dbo].[storedProcedureName] @someString VarChar(150) As BEGIN -- Sql queries goes here END
для MySQL синтаксис создания процедуры:
CREATE PROCEDURE storedProcedureName( IN someString VarChar(150) ) BEGIN -- Sql queries goes here END
В коде MS SQL, я создал несколько временных таблиц, которые требуются для применения. Синтаксис для создания временной таблицы различается, как показано ниже.
MS SQL синтаксис создания временной таблицы:
CREATE TABLE #tableName( emp_id VARCHAR(10)COLLATE Database_Default PRIMARY KEY, emp_Name VARCHAR(50) COLLATE Database_Default, emp_Code VARCHAR(30) COLLATE Database_Default, emp_Department VARCHAR(30) COLLATE Database_Default )
MySQL синтаксис создания временной таблицы:
CREATE TEMPORARY TABLE tableName( emp_id VARCHAR(10), emp_Name VARCHAR(50), emp_Code VARCHAR(30), emp_Department VARCHAR(30) );
Я использовал много условий в моих хранимых процедур и триггерах, которые не работали после преобразования в MySQL, поскольку синтаксис отличается, как показано ниже.
MS SQL условие IF Синтаксис:
if(@intSomeVal='') BEGIN SET @intSomeVal=10 END
MySQL условие IF Синтаксис:
IF @intSomeVal='' THEN SET @intSomeVal=10; END IF;
Другое общее использование, если условие, проверить, вернулся ли в запросе какие-либо строки или нет; и если он возвращает несколько строк, сделать что-то. Для этого я использовал IF EXISTS в MS SQL, который должен быть преобразован в MySQL команды IF, как описано ниже.
MS SQL IF EXITS Пример:
IF EXISTS(SELECT 1 FROM #tableName WITH(NOLOCK) WHERE ColName='empType' ) BEGIN -- Sql queries goes here END
MySQL эквивалент выше, используя при выполнении условия:
IF(SELECT count(*) FROM tableName WHERE ColName='empType') > 0 THEN -- Sql queries goes here END IF;
Использование функций данных внутри хранимой процедуры является довольно распространенным явлением. В следующей таблице приведены различия между MS SQL и MySQL данных, связанных функций.
MS SQL Server | MySQL Server |
---|---|
GETDATE( ) | NOW( ) SYSDATE( ) CURRENT_TIMESTAMP( ) |
GETDATE( ) + 1 | NOW( ) + INTERVAL 1 DAY CURRENT_TIMESTAMP +INTERVAL 1 DAY |
DATEADD(dd, -1, GETDATE()) | ADDDATE(NOW(), INTERVAL -1 DAY) |
CONVERT(VARCHAR(19),GETDATE()) | DATE_FORMAT(NOW(),’%b %d %Y %h:%i %p’) |
CONVERT(VARCHAR(10),GETDATE(),110) | DATE_FORMAT(NOW(),’%m-%d-%Y’) |
CONVERT(VARCHAR(24),GETDATE(),113) | DATE_FORMAT(NOW(),’%d %b %Y %T:%f’) |
CONVERT(VARCHAR(11),GETDATE(),6) | DATE_FORMAT(NOW(),’%d %b %y’) |
В MS SQL хранимые процедуры, вы можете объявлять переменные где-то между “Begin” и “end”
Однако в MySql вам придется объявить их только после заявления хранимой процедуры “begin”. Декларация переменной в любой точке между не допускается.
В MS SQL, вы будете использовать SELECT, TOP, если вы хотите выбрать только первые несколько записей. Например, чтобы выбрать 1-ые 10 записей, вы сделаете следующее:
SELECT TOP 10 * FROM TABLE;
В MySQL, вам придется использовать LIMIT вместо TOP, как показано ниже.
SELECT * FROM TABLE LIMIT 10;
В MS SQL вы выполните следующие действия (функции Convert), чтобы преобразовать целое число в символ.
CONVERT(VARCHAR(50), someIntVal)
В MySQL, вы будете использовать функцию CAST для преобразования целого на символ, как показано ниже.
CAST( someIntVal as CHAR)
Если вы манипулируете множеством данных внутри хранимой процедуры, вы можете использовать выполнение некоторых конкатенации строк.
В MS SQL оператор конкатенации + символ. Пример такого использования показан ниже.
SET @someString = '%|' + @someStringVal + '|%'
В MySQL, если вы используете режим AnSi, то, он такой же, как и в MS SQL. т.е. + символ, будет работать для конкатенации.
Но, в режиме по умолчанию, в MySQL, мы должны использовать функцию CONCAT( “str1”, “str2”, “str3”.. “strN”).
SET someString = CONCAT('%|', someStringVal, '|%');