0

我正在尝试运行 mysql 查询来查找所有出现的文本。我有语法错误,但不知道在哪里或如何修复它

我正在使用 sqlyog 来执行这个脚本

DECLARE @url VARCHAR(255)

SET @url = '1720'

SELECT 'select * from ' + RTRIM(tbl.name) + ' where ' + 
          RTRIM(col.name) + ' like %' + RTRIM(@url) + '%'
FROM sysobjects tbl
INNER JOIN syscolumns col ON tbl.id = col.id 
AND col.xtype IN (167, 175, 231, 239) -- (n)char and (n)varchar, there may be others to include
AND col.length > 30 -- arbitrary min length into which you might store a URL
WHERE tbl.type = 'U'    -- user defined table

执行了 1 个查询,0 个成功,1 个错误,0 个警告

查询: declare @url varchar(255) set @url = '1720' select 'select * from ' + rtrim(tbl.name) + ' where ' + rtrim(col.name) + ' like %' ...

错误代码:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'declare @url varchar(255) 附近使用正确的语法

4

3 回答 3

6

对于 MySQL 更改此:

DECLARE @url VARCHAR(255)
SET @url = '1720'

到:

SET @url := '1720'

在 MySQL 中,您不需要 DECLARE 用户变量,只需将它们设置为一个值。等号适用于赋值,除了在 SQL 语句中,您需要使用 Pascal 样式:=作为赋值运算符。(我通常:=在 SET 语句的上下文中使用赋值运算符,即使在等号中也同样有效。)

但是,在查看您的 SQL 语句时,这似乎是 Microsoft SQL Server 语法、+连接运算符、对 sysobjects 的引用、syscolumns.xtype。

这条语句不可能从 MySQL 返回任何有用的东西。

整个语句需要重写才能查询:

information_schema.tables
information_schema.columns

作为示例起点:

SET @url := 'foobar';

SELECT CONCAT('select * from `',col.table_schema
             ,'`.`',col.table_name
             ,'` where `',col.column_name
             ,'` like ''%',RTRIM(@url),'%''') AS q
  FROM information_schema.columns col 
  JOIN information_schema.tables tbl
    ON tbl.table_schema = col.table_schema
   AND tbl.table_name = col.table_name
   AND tbl.table_type = 'BASE TABLE'
 WHERE col.data_type IN ('varchar','char')
   AND col.character_maximum_length >= 30
   AND col.table_schema = 'mydatabase';

更新:

要在每个查询的结果集中包含一个“查询 ID”,以便您可以确定哪些查询正在返回一行...

SELECT CONCAT('select ',@rn := @rn + 1, ' as q, t.* from `',col.table_schema
             ,'`.`',col.table_name
             ,'` t where `',col.column_name
             ,'` like ''%',RTRIM(@url),'%''') AS q
  FROM (SELECT @rn := 0) r
  JOIN information_schema.columns col 
  JOIN information_schema.tables tbl
    ON tbl.table_schema = col.table_schema
   AND tbl.table_name = col.table_name
   AND tbl.table_type = 'BASE TABLE'
 WHERE col.data_type IN ('varchar','char')
   AND col.character_maximum_length >= 30
   AND col.table_schema = 'mydatabase';
于 2012-08-31T21:53:56.660 回答
3

不要忘记分号:

DECLARE @url VARCHAR(255);
SET @url = '1720';
SELECT  .... ;

此外,@在 Mysql 中具有特殊含义(看起来像您移植 T-SQL 脚本)。与局部变量相比,您不需要声明它(没有@在 SP/Function/Trigger 的主体中使用)

于 2012-08-31T21:32:16.977 回答
1

在 MySQL 中,您不能在没有范围的情况下使用“Declare”,您只能在 Begin...End 块中使用它(例如:在存储过程等中)。
您不需要“Declare...”行,只需设置变量 @url 就足以让脚本运行。

于 2012-08-31T21:40:20.640 回答