2011-05-08 3 views
2

Я пытаюсь выполнить следующую инструкцию запроса, содержащуюся в хранимой процедуре - Где все P ... являются параметрами SP (ex PInitialDateFrom).Нужна помощь с запросом MySQL

SET @stmt_text = CONCAT('SELECT AccountID, Firstname as ClientName, EmailID 
       , ProductID, InitialPurchaseDate as Purchasedate 
       FROM client_account 
       WHERE IsRemoved = 0 
       AND (InitialPurchasedate between ? and ?) 
       AND ProductId IN (?)'); 

PREPARE stmt FROM @stmt_text; 

SET @initDt1=PInitialDateFrom, @initDt2 = PInitialDateTo, @inlist=PIDs 
    , @stmt_text = null; 

EXECUTE stmt USING @initDt1, @initDt2, @inlist; 

DEALLOCATE PREPARE stmt; 

Я передаю PID как строку ИДС как 1,2,3 При попытке выполнить оператор, только первым идентификатор считается. Напр. 1,2,3 используется только 1, если используется 3,2,1, используется только 3.

Может кто-нибудь сказать, что не так в этом вопросе?

ответ

2

Вы не можете использовать эту часть:

and ProductId in (?) 

Помните: параметры SQL не как C макросов, где вы просто делаете строки замену. Они больше, чем тар: Когда вы используете ?, , один и тот же параметр привязывается. Итак, когда вы пытаетесь связать 1,2,3 с этим параметром, это не похоже на то, что вы пытаетесь связать три значения, но только одно.

Если список будет фиксированного размера, вы можете использовать:

and ProductId in (?,?,?) 

В противном случае, я не думаю, что вы будете иметь возможность использовать параметры для этой статьи. Может быть, сделать что-то вроде:

set @initDt1=PInitialDateFrom, 
    @initDt2 = PInitialDateTo, 
    @inlist=PIDs, 
    @stmt_text = null; 
set @stmt_text = 
    concat('Select AccountID, Firstname as ClientName, EmailID, ProductID 
    , InitialPurchaseDate as Purchasedate from client_account 
    where IsRemoved=0 and (InitialPurchasedate between ? and ?) 
    and ProductId in (', @inlist, ')'); 
prepare stmt from @stmt_text; 
execute stmt using @initDt1, @initDt2; 
deallocate prepare stmt; 

Убедитесь, что вы дезинфицировать ваш вход для PIDs, так что вы не добавляйте SQLInjection уязвимости к коду.

+0

Спасибо Pablo. Есть ли другой способ, как разделение строки в массив? – IrfanRaza

+2

Попробуйте сделать то, что я показал вам в последнем примере. Не используйте свой список в качестве параметра для вашего запроса, но конкатенируйте его в исходной строке. Убедитесь, что вы дезинфицируете свой ввод, чтобы не добавлять уязвимости SQLInjection к вашему коду. –

+0

Еще раз спасибо Пабло. Работает. – IrfanRaza

0

Вы должны поместить его так:

and ProductID = (?) 

Я надеюсь, что это работает.

+0

Спасибо, но его не работает. И я вещь = не будет работать, поскольку мне нужно принимать значения из группы. – IrfanRaza

Смежные вопросы