2012-08-31 2 views
0

mysql 쿼리를 실행하여 모든 텍스트를 찾으려고합니다. 나는 구문 오류가 있지만 어디 또는 어떻게이 스크립트를 실행SQL 구문에 오류가 있습니다. 귀하의 MySQL에 해당하는 설명서를 확인하십시오.

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 경고

쿼리를 실행 SQLyog에 사용하고 그것을

를 해결하기 위해 잘 모릅니다 : + rtrim (col.name) + 'like like'... '를 선택하십시오.

(영문 일 수 있음)

오류 코드 : 1064 SQL 구문에 오류가 있습니다. @url의 VARCHAR 선언 '에 가까운 사용할 수있는 권리 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인 (255)

+0

오류 메시지가 사라질 때까지 한 번에 하나의 명령문을 제거하면 쉽게 좁힐 수 있습니다. – halfer

+1

@ LuisEValencia : SQL 서버 스크립트를 MySQL로 포팅하는 것 같습니다. 나는 이것이 잘못된 것이라고 생각했지만, 반환 된 에러 메시지는 분명히 MySQL로부터왔다. 스크립트의 구문은 분명히 SQL Server입니다. 다소 답답한 MySQL 쿼리에 대한 내 대답을보십시오. – spencer7593

+0

이 질문의 제목은 정말로 바꿔야합니다 ... – spencer7593

답변

5

MySQL을 변경할 경우 :

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

에 : MySQL의에서

SET @url := '1720' 

, 당신은 단지 값을 설정, 사용자 변수를 선언하지 않습니다. 등호는 Pascal 스타일 :=을 대입 연산자로 사용해야하는 SQL 문을 제외하고 대입에 사용됩니다. 대개는 등호가 똑같이 작동하더라도 SET 문에 따라 := 할당 연산자를 사용합니다.

그러나 SQL 문을 보면 Microsoft SQL Server 구문 인 것으로 나타났습니다. 연결을 위해 + 연산자 인 sysobjects, syscolumns.xtype을 참조하십시오.

이 문장은 MySQL에서 유용한 것을 반환 할 방법이 없습니다.

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'; 

가 UPDATE :

이를 포함하려면 예를 들어

information_schema.tables 
information_schema.columns 

시작 지점 :

은 전체 문장은 쿼리 재 작성 될 필요가 있음 각 검색어의 결과 집합에 'query 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'; 
+0

알겠습니다 : 'field list'에 'tbl.name'열이 없습니다. –

+0

@LuisEValencia : 편집 했으므로 SQL 문은 MySQL에서 결과 세트를 반환해야합니다. – spencer7593

+0

이들은 생성 된 sql입니다 : SELECT * FROM'theprint_depotlive-v16'.'zizio_groupsale' WHERE'zizio_object_id' LIKE '% 1720 %' 하지만 문법 오류가 있다고 말합니다. –

3

세미콜론을 잊지 마세요 :

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

또한, @는 MySQL의에서 특별한 의미를 가지고 (T-SQL 스크립트를 이식하는 것처럼 보입니다). 지역 변수 (SP/함수/트리거의 본문에 사용되는 @ 제외)와는 대조하여 선언 할 필요가 없습니다.

+0

괜찮 았으나 스크립트는 아무 것도 검색하지 않습니다. 테이블 'theprint_depotlive-v17.sysobjects'가 존재하지 않습니다. –

+1

Mysql에서 SQLServer 스크립트를 실행하려고합니다. 이 2 RDMS는 시스템 테이블/뷰 및 SQL dialect의 구조가 매우 다릅니다. 질문에 태그를 잘못 입력하지 않았다면 쿼리를 완전히 다시 작성해야합니다. – a1ex07

1

MySQL에서는 범위가없는 "선언"을 사용할 수 없으며, Begin ... End 블록에서 (예 : 저장 프로 시저에서 등).
"선언 ..."줄이 필요하지 않습니다. @url 변수를 설정하면 스크립트를 실행할 수 있습니다.