2017-02-07 4 views
0

몇 년 전 누군가 쓴 몇 가지 PHP/MySQL보고 코드를 업데이트하고 있습니다. 단일 PHP 페이지에는 50 개가 넘는 SQL 문이 있습니다. 그들 중 일부는 임시 테이블을 생성하며, 모두 동적 테이블 (예 : Report_201701)을 적어도 하나 이상 참조합니다.이 테이블은 변수를 사용하는 PHP에서 간단합니다.준비된 문을 보는 방법 또는 동적 테이블 이름을 포기해야합니까?

그러나 이러한 모든 명령문을 MySQL Workbench에 적용하여 문제를 해결하고 향상시키기 때문에 동적 테이블 이름에 변수를 사용하기 때문에 준비된 명령문의 출력을 볼 수 없기 때문에 문제가 발생합니다.

동적 SQL에 익숙하지 않습니다. 쿼리 결과를 보거나 출력 할 수있는 방법이 있습니까? According to this post 그럴 수 없습니다.

문장의 몇

내가이 같은 변수에 할당하여 볼 수 있었던 하나의 값 반환 :

set @sqlQuery = 
    Concat(
     'SELECT 1 as "A" 
     into @sqlOut;' 
    ); 
    #$opentickets = mysql_result($sqlQuery, 0); 
PREPARE stmt1 from @sqlQuery; 
EXECUTE stmt1; 
deallocate prepare stmt1; 
select @sqlOut; 

# @sqlOut 
----------- 
1 

을하지만 여러 열 또는 여러 행을 반환 결과를 시도하는 경우 다음과 같은 오류가 발생합니다.

set @sqlQuery = 
    Concat(
     'SELECT 1 as "A", 2 as "B", 3 as "C" 
     into @sqlOut;' 
    ); 
    #$opentickets = mysql_result($sqlQuery, 0); 
PREPARE stmt1 from @sqlQuery; 
EXECUTE stmt1; 
deallocate prepare stmt1; 
select @sqlOut; 

Error Code: 1222. The used SELECT statements have a different number of columns 


set @sqlQuery = 
    Concat(
     'SELECT 1 as "A" 
     UNION SELECT 2 as "A" 
     UNION SELECT 3 as "A" 
     into @sqlOut;' 
    ); 
    #$opentickets = mysql_result($sqlQuery, 0); 
PREPARE stmt1 from @sqlQuery; 
EXECUTE stmt1; 
deallocate prepare stmt1; 
select @sqlOut; 

Error Code: 1172. Result consisted of more than one row 

가장 좋은 방법은 무엇입니까? 지금 동적 테이블 이름을 정적 이름으로 대체 하시겠습니까? (이 상황에서 임시 테이블은 날짜를 나타내는 이름을 가질 필요가 없으므로 영구적으로 그렇게 할 생각입니다.)

+1

참고로, 데이터베이스 엔진에가는 모든 것을 기록합니다. 정말 유용합니다. SQL을 구축하는 많은 라이브러리를 보았을 때, 그들이 한 일을 알려줄 것입니다. 이 모든 것은 SQL 디버깅에 매우 유용합니다. –

+0

팁 @ RyanVincent에 감사드립니다. 내가 필요로 할 때 그것을 켜기 위해 어디에서 점검해야 할 것이다. – MJA

답변

0

글쎄, 나는 MySQL Workbench가 출력 한 SELECT 문을 출력한다는 것을 발견했습니다. 변수에 지정할 필요가 없습니다. 이것이 누군가를 도울 것인지 확실하지 않거나 확실한 진술을 위해 삭제해야하는지 확실하지 않습니다.

set @sqlQuery = 
    Concat(
     'SELECT 1 as "A", 2 as "B", 3 as "C" 
     UNION SELECT 10 as "A", 20 as "B", 30 as "C" 
     UNION SELECT 100 as "A", 200 as "B", 300 as "C";' 
    ); 
PREPARE stmt1 from @sqlQuery; 
EXECUTE stmt1; 
deallocate prepare stmt1; 

반환 : 당신이 정말로 당신은 MySQL의 '일반 로그인'을 사용할 수 있습니다 박히 경우

A  B  C 
'1'  '2'  '3' 
'10' '20' '30' 
'100' '200' '300'