mysql - 将 SQL 查询转换为 mysql 查询时出错

标签 mysql

我有一个 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/

相关文章:

mysql - SQL - 获取子查询子集中的最新记录或使用 GROUP BY 加入

java - 数据库中查询的计数问题

MySQL 插入并锁定表写入

android - 简单的 MySQL 数据库问题 - 每个应用程序用户的数据库?

mysql - 在没有主键的情况下删除 MySQL 数据库中的重复条目

php - 检查空结果(PHP、PDO 和 MySQL)

mysql - 启动 lampp 时 Phpmyadmin 未打开

php动态表,每行都有动态组合框

MySQL 搜索 Paul 和 Paul JD 的例子?

PHP/Javascript - 更改按钮图像并调用数据库 onClick()?