Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

fael

Stored Procedure

Recommended Posts

Pessoal,

 

Estou trabalhando com SP no SQL Server e me deparei com o seguinte problema:

 

Quando executo a minha SP, o SQL Server "corta" o sql plano.

 

O Código fonte da SP é a seguinte:

 

CREATE PROCEDURE orange_pesquisa
   @pht_keyword as varchar(1000) = '',
   @pht_logico as int = 0, --1:todas as palavras, 2:qualquer uma das palavras,3:frase exata
   @pht_orientacao as varchar(1) = '',
   @pht_cor as varchar(1) = '',
   @pht_cor2 as varchar(1) = '',
   @pht_tipo as varchar(2) = '',
   @pht_categoria as varchar(3) = '',
   @pht_fornecedor as varchar(3) = '',
   @pht_ponto_vista as varchar(2) = '',
   @pht_enquadramento as varchar(2) = '',
   @pht_locacao as varchar(5) = '',
   @pht_genero as varchar(5) = '', 
   @pht_quantidade as varchar(5) = '',
   @pht_faixaetaria as varchar(5) = ''
AS
   declare @strSQL as varchar(2000)
   --declare @strSelect as varchar(500)

   SET NOCOUNT ON

   Set @strSQL = 'SELECT pht.pht_id, pht_codigo, pas.pas_id AS pas_id, pht_publica, pht_dt_alteracao, mgr.mgr_nome, for_id, ' +
                 'pht_orientacao, pht_cor, pht_tipo, pht_ponto_vista, pht_enquadramento '

   if @pht_categoria <> ''
     begin
       Set @strSQL = @strSQL + ', categorias_photos.cat_id, categorias_photos.pht_id, categorias.cat_nome '
     end

   if (@pht_locacao <> '' or @pht_genero <> '' or @pht_quantidade <> '' or @pht_faixaetaria <> '')
     begin
       Set @strSQL = @strSQL + ', photos_keywords_tipos.pht_id, keywords.key_id, key_nome, keywords_tipo.ket_id, keywords_tipo.ket_nome '
     end

   Set @strSQL = @strSQL + 'FROM photos pht '+
                           'INNER JOIN pastas AS pas ON pht.pas_id = pas.pas_id '

   if @pht_categoria <> ''
     begin
       Set @strSQL = @strSQL + 'INNER JOIN categorias_photos ON categorias_photos.pht_id = pht.pht_id ' +
                               'INNER JOIN categorias        ON categorias.cat_id        = categorias_photos.cat_id '
     end

   if (@pht_locacao <> '' or @pht_genero <> '' or @pht_quantidade <> '' or @pht_faixaetaria <> '')
     begin
      Set @strSQL = @strSQL + 'INNER JOIN photos_keywords_tipos ON photos_keywords_tipos.pht_id = pht.pht_id ' +
                              'INNER JOIN keywords              ON keywords.key_id              = photos_keywords_tipos.key_id ' +
                              'INNER JOIN keywords_tipo         ON keywords_tipo.ket_id         = keywords.ket_id '
     end

   Set @strSQL = @strSQL + 'LEFT JOIN mgr_users AS mgr ON pht.mgr_id = mgr.mgr_id '

   if @pht_keyword <> ''
     begin
       Set @pht_keyword = lower(rtrim(ltrim(@pht_keyword)))
       Set @pht_keyword = replace(@pht_keyword,' de ',' ')
       if @pht_logico = 1 --todas as palavras
         begin 
           Set @pht_keyword = replace(@pht_keyword,' ',' and ')
           Set @pht_keyword = replace(@pht_keyword,'and not and','and not') --Troca os and's adicionados em volta de not+not por apenas and not
         end
       else
         if @pht_logico = 2 --qualquer uma das palavras
           begin
             Set @pht_keyword = replace(@pht_keyword,' ',' or ')
             Set @pht_keyword = replace(@pht_keyword,'or not or','and not') --Troca os or's adicionados em volta de not+not por apenas and not
           end
          else --frase exata
            begin 
              Set @pht_keyword = '"'+@pht_keyword+'"'
            end

    Set @strSQL = @strSQL + 'WHERE CONTAINS(pht_keyword,'''+@pht_keyword+''')'

    if @pht_orientacao <> ''
      begin 
        Set @strSQL = @strSQL + ' AND pht_orientacao='''+@pht_orientacao+''''
      end

    if @pht_tipo <> ''
      begin 
        Set @strSQL = @strSQL + ' AND pht_tipo='''+@pht_tipo+''''
      end

-- Incio do teste de cores
   if @pht_cor <> ''
     Set @strSQL = @strSQL + ' AND (pht_cor='''+@pht_cor+''''

     if @pht_cor2 <> ''
       begin
         if @pht_cor <> ''
           Set @strSQL = @strSQL + ' OR '
         else 
           Set @strSQL = @strSQL + ' AND ('
           Set @strSQL = @strSQL + ' pht_cor='''+@pht_cor2+''''
         end

     if (@pht_cor2 <> '') or (@pht_cor <> '')
       begin
         Set @strSQL = @strSQL + ')'
       end
-- Fim do teste de cores

   if @pht_categoria <> ''
     begin
       Set @strSQL = @strSQL + ' AND categorias.cat_id='''+@pht_categoria+''''
     end

   if @pht_fornecedor <> ''
     begin 
       Set @strSQL = @strSQL + ' AND for_id='''+@pht_fornecedor+''''
     end

   if @pht_ponto_vista <> ''
     begin 
       Set @strSQL = @strSQL + ' AND pht_ponto_vista='''+@pht_ponto_vista+''''
     end

   if @pht_enquadramento <> ''
     begin 
       Set @strSQL = @strSQL + ' AND pht_enquadramento='''+@pht_enquadramento+''''
     end

   if @pht_genero <> ''
     begin 
       Set @strSQL = @strSQL + ' AND keywords.key_id='''+@pht_genero+'''' + 
                               ' AND keywords_tipo.ket_id = ''5'''
     end

   if @pht_locacao <> ''
     begin 
       Set @strSQL = @strSQL + ' AND keywords.key_id='''+@pht_locacao+'''' + 
                               ' AND (keywords_tipo.ket_id BETWEEN ''1'' AND ''3'')'
     end

   if @pht_quantidade <> ''
     begin 
       Set @strSQL = @strSQL + ' AND keywords.key_id='''+@pht_quantidade+'''' + 
                               ' AND keywords_tipo.ket_id = ''6'''
     end

   if @pht_faixaetaria <> ''
     begin 
       Set @strSQL = @strSQL + ' AND keywords.key_id='''+@pht_faixaetaria+'''' + 
                               ' AND keywords_tipo.ket_id = ''8'''
     end

  end
   Set @strSQL = @strSQL + ' ORDER BY pht_codigo DESC'
   print @strSQL -- imprime sql plano da procedure na sada padrao de erros
   exec (@strSQL)
   SET NOCOUNT OFF
GO

 

E o sql plano de saída é o seguinte:

 

SELECT pht.pht_id, pht_codigo, pas.pas_id AS pas_id, pht_publica, pht_dt_alteracao, mgr.mgr_nome, for_id, pht_orientacao, pht_cor, pht_tipo, pht_ponto_vista, pht_enquadramento , photos_keywords_tipos.pht_id, keywords.key_id, key_nome, keywords_tipo.ket_id, keywords_tipo.ket_nome 
FROM photos pht 
INNER JOIN pastas AS pas         ON pht.pas_id                   = pas.pas_id 
INNER JOIN photos_keywords_tipos ON photos_keywords_tipos.pht_id = pht.pht_id 
INNER JOIN keywords              ON keywords.key_id              = photos_keywords_tipos.key_id 
INNER JOIN keywords_tipo         ON keywords_tipo.ket_id         = keywords.ket_id 
LEFT JOIN mgr_users AS mgr       ON pht.mgr_id                   = mgr.mgr_id 
WHERE CONTAINS(pht_keyword,'pessoa and not cao') 
AND pht_orientacao='h' AND pht_tipo='fo' AND (pht_cor='c' OR  pht_cor='p') AND for_id='1' AND pht_ponto_vista='co' AND pht_enquadramento='ga' AND keywords.key_id='53' AND keywords_tipo.ket_id = '5' AND keywords.key_id='23' AND (keywords_tipo.ket_id BETWEEN '1' AND '3') 
ORDER BY pht_codigo DESC

 

Até aí beleza, mas quando passo mais um parâmetro, ele fica assim:

 

SELECT pht.pht_id, pht_codigo, pas.pas_id AS pas_id, pht_publica, pht_dt_alteracao, mgr.mgr_nome, for_id, pht_orientacao, pht_cor, pht_tipo, pht_ponto_vista, pht_enquadramento , photos_keywords_tipos.pht_id, keywords.key_id, key_nome, keywords_tipo.ket_id, keywords_tipo.ket_nome 
FROM photos pht 
INNER JOIN pastas AS pas         ON pht.pas_id                   = pas.pas_id 
INNER JOIN photos_keywords_tipos ON photos_keywords_tipos.pht_id = pht.pht_id 
INNER JOIN keywords              ON keywords.key_id              = photos_keywords_tipos.key_id 
INNER JOIN keywords_tipo         ON keywords_tipo.ket_id         = keywords.ket_id 
LEFT JOIN mgr_users AS mgr       ON pht.mgr_id                   = mgr.mgr_id 
WHERE CONTAINS(pht_keyword,'pessoa and not cao') AND pht_orientacao='h' AND pht_tipo='fo' AND (pht_cor='c' OR  pht_cor='p') AND for_id='1' AND pht_ponto_vista='co' AND pht_enquadramento='ga' AND keywords.key_id='53' AND keywords_tipo.ket_id = '5' AND keywords.key_id='23' AND (keywords_tipo.ket_id BETWEEN '1' AND '3') AND keywords.key_id='56' AND keywords_tipo.ket_id WEBSERVER

 

Onde WEBSERVER, é o nome do servidor, não sei porque ele colocou isso no final!!!

 

Desde já agradeço! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

Abraço,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, Problemas assim acontece por limitaçao de tamanho da STRING.Tente usar como VARCHAR(8000). Pode ser também configuração do servidor, nessa parte eu não sei te informar.Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.