Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 对所有表执行查询,并在新表中填写数据_Mysql_Sql - Fatal编程技术网

Mysql 对所有表执行查询,并在新表中填写数据

Mysql 对所有表执行查询,并在新表中填写数据,mysql,sql,Mysql,Sql,我需要得到带有这些字段的结果表 -表名称、最小日期、最大日期 这是我的查询,我应该为所有表执行 SELECT MIN(short_date) as FirstDuplicatedDate, MAX(short_date) as LastDuplicatedDate FROM (SELECT short_date, type, value, count(*) as cnt FROM testTable GROUP BY short_date HAVING COUNT(*) > 1) a

我需要得到带有这些字段的结果表 -表名称、最小日期、最大日期

这是我的查询,我应该为所有表执行

SELECT MIN(short_date) as FirstDuplicatedDate, MAX(short_date) as LastDuplicatedDate
FROM (SELECT  short_date, type, value,  count(*) as cnt
FROM testTable
GROUP BY  short_date
HAVING COUNT(*) > 1) as Duplicates
然后我发现了如何获取所有表名 我是这样做的

SELECT TABLE_NAME as name FROM `information_schema`.`TABLES`
WHERE `TABLES`.`TABLE_SCHEMA` = 'test'
AND `TABLES`.`TABLE_NAME` LIKE 'test%'
DECLARE @DB_Name varchar(50)
DECLARE @Command varchar(100);
DECLARE database_cursor CURSOR FOR 
SELECT name 
FROM (SELECT TABLE_NAME as name FROM `information_schema`.`TABLES`
WHERE `TABLES`.`TABLE_SCHEMA` = 'test'
AND `TABLES`.`TABLE_NAME` LIKE 'test%') as TableNames

OPEN database_cursor

FETCH NEXT FROM database_cursor INTO @DB_Name

WHILE @@FETCH_STATUS = 0 
BEGIN 
     SELECT @Command = 'SELECT MIN(short_date) as FirstDuplicatedDate, MAX(short_date) as LastDuplicatedDate
FROM (SELECT  short_date, type, value,  count(*) as cnt
FROM ' + @DB_Name + '
WHERE type = ''test''
GROUP BY  short_date, type, value
HAVING COUNT(*) > 1) as Duplicates'
     EXEC sp_executesql @Command

     FETCH NEXT FROM database_cursor INTO @DB_Name 
END

CLOSE database_cursor 
DEALLOCATE database_cursor
但我不知道如何对所有表执行它,并将结果填入新表中

我试着这样做

SELECT TABLE_NAME as name FROM `information_schema`.`TABLES`
WHERE `TABLES`.`TABLE_SCHEMA` = 'test'
AND `TABLES`.`TABLE_NAME` LIKE 'test%'
DECLARE @DB_Name varchar(50)
DECLARE @Command varchar(100);
DECLARE database_cursor CURSOR FOR 
SELECT name 
FROM (SELECT TABLE_NAME as name FROM `information_schema`.`TABLES`
WHERE `TABLES`.`TABLE_SCHEMA` = 'test'
AND `TABLES`.`TABLE_NAME` LIKE 'test%') as TableNames

OPEN database_cursor

FETCH NEXT FROM database_cursor INTO @DB_Name

WHILE @@FETCH_STATUS = 0 
BEGIN 
     SELECT @Command = 'SELECT MIN(short_date) as FirstDuplicatedDate, MAX(short_date) as LastDuplicatedDate
FROM (SELECT  short_date, type, value,  count(*) as cnt
FROM ' + @DB_Name + '
WHERE type = ''test''
GROUP BY  short_date, type, value
HAVING COUNT(*) > 1) as Duplicates'
     EXEC sp_executesql @Command

     FETCH NEXT FROM database_cursor INTO @DB_Name 
END

CLOSE database_cursor 
DEALLOCATE database_cursor
但我犯了这个错误

语法错误或访问冲突:1064您的SQL中有错误 句法;检查与MySQL服务器版本对应的手册 对于要使用near'DECLARE@DB_Name varchar(50)DECLARE的正确语法 @第1行的命令varchar(100)'

UPD

CREATE PROCEDURE GetData()
BEGIN

DECLARE @DB_Name varchar(50), @Command varchar(100);
DECLARE database_cursor CURSOR FOR 
SELECT name 
FROM (SELECT TABLE_NAME as name FROM `information_schema`.`TABLES`
WHERE `TABLES`.`TABLE_SCHEMA` = 'test'
AND `TABLES`.`TABLE_NAME` LIKE 'test%_') as TableNames

OPEN database_cursor

FETCH NEXT FROM database_cursor INTO @DB_Name

WHILE @@FETCH_STATUS = 0 
BEGIN 
     SELECT @Command = 'SELECT MIN(short_date) as FirstDuplicatedDate, MAX(short_date) as LastDuplicatedDate
FROM (SELECT  short_date, type, value,  count(*) as cnt
FROM ' + @DB_Name + '
WHERE type = ''test''
GROUP BY  short_date, type, value
HAVING COUNT(*) > 1) as Duplicates'
     EXEC sp_executesql @Command

     FETCH NEXT FROM database_cursor INTO @DB_Name 
END;

CLOSE database_cursor 
DEALLOCATE database_cursor

END;

CALL GetData()

在开始处添加分隔符$$;添加
分隔符
结束后

摆脱声明命令。而是使用不需要声明的
@命令

添加
SELECT@command
选择@命令之后:=以便我们可以进行一些调试

关闭
解除分配
语句需要
以终止它们

测试要提取的行数是否不足

您确实需要看一些存储过程的示例,特别是那些带有游标的存储过程

更新

啊,我甚至没有发现一半的语法错误。这可能有用(我不知道,因为我没有您特定的表或列):


据我所知,这个错误是由于,
DELIMETER
和另外一件事,您必须正确地应用游标来迭代整个
行集
。在下面的代码中,我用
游标
写下了
过程
。进行动态查询并使用

PREPARE stmt FROM @VAR_QRY; EXECUTE stmt;
动态查询将返回您想要的确切输出。这里我假设您对
触发器
循环
光标

试试下面的代码。 希望这会有所帮助

DROP PROCEDURE IF EXISTS ITERATEALLTABLE;
DELIMITER $$
CREATE PROCEDURE ITERATEALLTABLE()
BEGIN
DECLARE VAR_TABLE varchar(100);
DECLARE VAR_QRY varchar(100);
DECLARE VAR_FINISHED INT(11) DEFAULT 0;
DECLARE DATABASE_CURSOR CURSOR FOR 
                SELECT name AS TableNames
                FROM (
                    SELECT TABLE_NAME as name FROM `information_schema`.`TABLES`
                    WHERE `TABLES`.`TABLE_SCHEMA` = 'test'
                    AND `TABLES`.`TABLE_NAME` LIKE 'test%'
                )Z ;


                DECLARE CONTINUE HANDLER FOR NOT FOUND SET VAR_FINISHED = 1;

                OPEN DATABASE_CURSOR;
                GET_NEXTRECORD: LOOP

                        FETCH DATABASE_CURSOR INTO VAR_TABLE;

                            IF VAR_FINISHED = 1 THEN 
                            LEAVE GET_NEXTRECORD;
                            END IF;

                            SET @VAR_QRY = CONCAT("SELECT MIN(short_date) as FirstDuplicatedDate, MAX(short_date) as LastDuplicatedDate
                            FROM (SELECT  short_date, type, value,  count(*) as cnt
                            FROM " , VAR_TABLE , " WHERE type = 'test'
                            GROUP BY  short_date, type, value
                            HAVING COUNT(*) > 1) as Duplicates");

                            PREPARE stmt FROM @VAR_QRY;
                            EXECUTE stmt;

                END LOOP GET_NEXTRECORD;

                CLOSE DATABASE_CURSOR;

END;

CALL ITERATEALLTABLE;

对。。。你可能想试试这个

删除此行,然后再次运行查询

DECLARE @DB_Name varchar(50), @Command varchar(100);

我认为在mysql中,您可以只使用变量而不声明它,然后在必要时强制转换。

您已经标记了sql server和mysql。由于错误消息引用了mysql,SQLServerOne肯定是错误的。请把它取下来。谢谢。我还应该说删除t-sql,因为这是sql Server(而不是MySQL)上使用的sql的风格。你能举一个例子说明你试图做什么exactlySQLSTATE[42000]:语法错误或访问冲突:1064你的sql语法有错误;查看与您的MySQL服务器版本对应的手册,以了解使用“DELIMITER$$什么版本的MySQL”附近的正确语法?在
分隔符
$$
之间是否有空格?您使用哪个客户端将其发送到MySQL服务器?(我使用的是mysql命令行工具。)在
删除
之前是否有另一个
分隔符
语句?以及我之前评论中的问题?再次尝试应用我的代码——这次添加
立即选择()分隔符$$
之前的code>。
声明中的
VAR\u QRY
@VAR\u QRY
完全不同。