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 構文にエラーがあります。near 'declare @url varchar(255) を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

4

3 に答える 3

6

MySQL の場合、これを変更します。

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

に:

SET @url := '1720'

MySQL では、ユーザー変数を DECLARE せずに、値を設定するだけです。:=パスカル スタイルを代入演算子として使用する必要がある SQL ステートメント内を除き、等号は代入に使用できます。(私は通常:=、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 に答える