我正在尝试运行一个 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)
附近使用的正确语法
最佳答案
对于 MySQL 改变这个:
DECLARE @url VARCHAR(255)
SET @url = '1720'
到:
SET @url := '1720'
在 MySQL 中,您无需声明用户变量,只需将它们设置为一个值即可。等号适用于赋值,但在 SQL 语句中除外,您需要使用 Pascal 风格的 := 作为赋值运算符。 (我通常在 SET 语句的上下文中使用 := 赋值运算符,即使在等号中同样可以正常工作。)
但是,在查看您的 SQL 语句时,这似乎是 Microsoft SQL Server 语法,使用 + 运算符进行连接,对 sysobjects、syscolumns.xtype 的引用。
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';