Lui*_*cia 0 mysql mysql-error-1064
我试图运行一个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
Run Code Online (Sandbox Code Playgroud)
执行了1个查询,0个成功,1个错误,0个警告
查询:声明@url varchar(255)set @url ='1720'选择'select*from'+ rtrim(tbl.name)+'where'+ rtrim(col.name)+'like%'...
错误代码:1064您的SQL语法有错误; 检查与MySQL服务器版本对应的手册,以便在'declare @url varchar(255)附近使用正确的语法
对于MySQL改变这个:
DECLARE @url VARCHAR(255)
SET @url = '1720'
Run Code Online (Sandbox Code Playgroud)
至:
SET @url := '1720'
Run Code Online (Sandbox Code Playgroud)
在MySQL中,您没有DECLARE用户变量,只需将它们设置为值即可.等号适用于赋值,除了在SQL语句中,您需要使用Pascal样式:=作为赋值运算符.(我通常:=在SET语句的上下文中使用赋值运算符,即使在等号中也同样正常.)
但是,在查看SQL语句时,看起来这是Microsoft SQL Server语法,+连接运算符,sysobjects的引用,syscolumns.xtype.
这句话无法从MySQL返回任何有用的东西.
需要重写整个语句来查询:
information_schema.tables
information_schema.columns
Run Code Online (Sandbox Code Playgroud)
作为一个示例出发点:
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';
Run Code Online (Sandbox Code Playgroud)
更新:
要在每个查询的结果集中包含"查询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';
Run Code Online (Sandbox Code Playgroud)