我有一个 TSQL 查询,用于在 sql 服务器中创建 View 。 我有一个类似的 MySQL 环境,我想在其中创建相同的 View 集。 我使用SQLLines在线转换器将Mssql查询转换为mysql查询,因为我对mysql中的语法和函数不太熟悉。 但转换后的 Mysql 查询在变量声明本身处失败。
MSSQL查询
USE DB
GO
DECLARE @qos varchar(255), @pos int, @r_table varchar(255), @view varchar(255), @cview varchar(2048)
DECLARE qos_cursor CURSOR FOR
SELECT DISTINCT qos,r_table FROM S_QOS_DATA
ORDER BY 2
OPEN qos_cursor
-- Perform the first fetch.
FETCH NEXT FROM qos_cursor INTO @qos, @r_table
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
-- Check QOS name for '-' character & replace with '_' if exist
SELECT @pos = CHARINDEX('-',@qos, 1);
IF @pos != 0
BEGIN
SELECT @qos = STUFF(@qos, @pos, 1, '_');
END
-- Check QOS name for '/' character & replace with '_' if exist
SELECT @pos = CHARINDEX('/',@qos, 1);
IF @pos != 0
BEGIN
SELECT @qos = STUFF(@qos, @pos, 1, '_');
END
-- Check QOS name for '(' character & replace with '_' if exist
SELECT @pos = CHARINDEX('(',@qos, 1);
IF @pos != 0
BEGIN
SELECT @qos = STUFF(@qos, @pos, 1, '_');
END
-- Check QOS name for ')' character & replace with '_' if exist
SELECT @pos = CHARINDEX(')',@qos, 1);
IF @pos != 0
BEGIN
SELECT @qos = STUFF(@qos, @pos, 1, '_');
END
-- Create view
SET @view = 'V_'+@qos
SET @cview = 'CREATE VIEW '+@view+' AS '+
'SELECT Q.source,Q.target,Q.origin,Q.robot,Q.probe,D.sampletime,D.samplevalue,D.samplestdev,D.samplerate,D.tz_offset '+
'FROM S_QOS_DATA Q JOIN '+@r_table+' D ON Q.table_id=D.table_id';
BEGIN TRY
exec ('DROP VIEW '+@view)
END TRY
BEGIN CATCH
-- Suppress Error message for Views that don't exist
END CATCH
BEGIN TRY
-- Create the View, Catch tables that don't have samplestdev & samplerate fields
exec (@cview);
PRINT 'Created View: ' + @view
END TRY
BEGIN CATCH
SET @cview = 'CREATE VIEW '+@view+' AS '+
'SELECT Q.source,Q.target,Q.origin,Q.robot,Q.probe,D.sampletime,D.samplevalue,D.tz_offset '+
'FROM S_QOS_DATA Q JOIN '+@r_table+' D ON Q.table_id=D.table_id';
exec (@cview);
PRINT 'Created View: ' + @view
END CATCH
-- PRINT 'qos: ' + @qos + ' ' + @r_table+' '+@view
-- PRINT @cview
-- This is executed as long as the previous fetch succeeds.
FETCH NEXT FROM qos_cursor INTO @qos, @r_table
END
CLOSE qos_cursor
DEALLOCATE qos_cursor
GO
MySQL 查询:
use DB;
DECLARE v_qos varchar(255); DECLARE v_pos int; DECLARE v_r_table varchar(255); DECLARE v_view varchar(255); DECLARE v_cview varchar(2048)
DECLARE qos_cursor CURSOR FOR
SELECT DISTINCT qos,r_table FROM S_QOS_DATA
ORDER BY 2
OPEN qos_cursor
-- Perform the first fetch.
FETCH NEXT FROM qos_cursor INTO v_qos, v_r_table
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE NOT_FOUND = 0
DO
-- Check QOS name for '-' character & replace with '_' if exist
SET v_pos = CHARINDEX('-',v_qos, 1);
IF v_pos != 0
THEN
SET v_qos = INSERT(v_qos, v_pos, 1, '_');
END IF;
-- Check QOS name for '/' character & replace with '_' if exist
SET v_pos = CHARINDEX('/',v_qos, 1);
IF v_pos != 0
THEN
SET v_qos = INSERT(v_qos, v_pos, 1, '_');
END IF;
-- Check QOS name for '(' character & replace with '_' if exist
SET v_pos = CHARINDEX('(',v_qos, 1);
IF v_pos != 0
THEN
SET v_qos = INSERT(v_qos, v_pos, 1, '_');
END IF;
-- Check QOS name for ')' character & replace with '_' if exist
SET v_pos = CHARINDEX(')',v_qos, 1);
IF v_pos != 0
THEN
SET v_qos = INSERT(v_qos, v_pos, 1, '_');
END IF;
-- Create view
SET v_view = CONCAT('V_',v_qos)
SET v_cview = CONCAT('CREATE VIEW ',v_view,' AS ',
'SELECT Q.source,Q.target,Q.origin,Q.robot,Q.probe,D.sampletime,D.samplevalue,D.samplestdev,D.samplerate,D.tz_offset ',
'FROM S_QOS_DATA Q JOIN ',v_r_table,' D ON Q.table_id=D.table_id');
BEGIN TRY
set @stmt_str = CONCAT('DROP VIEW ',v_view);
prepare stmt from @stmt_str;
execute stmt;
deallocate prepare stmt;
END; TRY
BEGIN CATCH
-- Suppress Error message for Views that don't exist
END; CATCH
BEGIN TRY
-- Create the View, Catch tables that don't have samplestdev & samplerate fields
set @stmt_str = v_cview;
prepare stmt from @stmt_str;
execute stmt;
deallocate prepare stmt;
/* PRINT CONCAT('Created View: ' , v_view) */
END; TRY
BEGIN CATCH
SET v_cview = CONCAT('CREATE VIEW ',v_view,' AS ',
'SELECT Q.source,Q.target,Q.origin,Q.robot,Q.probe,D.sampletime,D.samplevalue,D.tz_offset ',
'FROM S_QOS_DATA Q JOIN ',v_r_table,' D ON Q.table_id=D.table_id');
set @stmt_str = v_cview;
prepare stmt from @stmt_str;
execute stmt;
deallocate prepare stmt;
/* PRINT CONCAT('Created View: ' , v_view) */
END; CATCH
-- PRINT 'qos: ' + @qos + ' ' + @r_table+' '+@view
-- PRINT @cview
-- This is executed as long as the previous fetch succeeds.
FETCH NEXT FROM qos_cursor INTO v_qos, v_r_table
END WHILE
CLOSE qos_cursor
看起来在线转换器已经替换了适合 MySQL 的功能,但是当我在 MySQL 5.7.20 中执行 mysql 查询时,我得到了
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE v_qos varchar(255); DECLARE v_pos int; DECLARE v_r_table varchar(255); D' at line 1
我尝试声明像declare@、select@这样的变量,但在MySQL中都给出了错误。
我很想探索自己,但时间很短,所以想到在社区中寻求专家的建议。
提前致谢。
最佳答案
您在最后一个 DECLARE
语句中忘记了分号 ;
...
您还需要在 ORDER 2
之后添加分号 ;
...
和分号;
在OPEN qos_cursor
之后...
关于mysql - 将 SQL 查询转换为 mysql 查询时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55154507/