2016-06-23 2 views
0

Я пытаюсь узнать, как использовать конкатенированную процедуру, но она не возвращает результат, который я хочу. Даже когда я использую командуПроцедура конкатенации SQL Server

EXEC SP_NAME_PROCEDURE NULL,NULL,NULL,NULL 

или используя данные справа.

ALTER PROCEDURE SP_LISTA_PEDIDOS 
    @Sdatainicio varchar(100), 
    @Sdatafim varchar(100), 
    @chaveBusca varchar(100), 
    @TipoBusca varchar(100) 
AS 
    DECLARE @SQL VARCHAR(8000) 

    SET @SQL += 'SELECT *,b.descricao as dscstatus,c.nome as cliente ' 

    SET @SQL += ' FROM pedidos a with(nolock), ' 
    SET @SQL += ' pedidos_status b with(nolock), ' 
    SET @SQL += ' cadastro c with(nolock) ' 

    SET @SQL += ' WHERE ' 
    SET @SQL += ' a.status <> '''' and ' 
    SET @SQL += ' a.status=b.status and ' 
    SET @SQL += ' a.id_doc = c.id_doc ' 

    IF isnull(@chaveBusca,'')<>'' 
    BEGIN 
     IF isnull(@TipoBusca,'') = 'PEDIDO' 
      SET @SQL += ' and a.numped= '''[email protected]+'''' 

     IF isnull(@TipoBusca,'') = 'CLIENTE' 
      SET @SQL += ' and c.nome like '''[email protected]+'%''' 
    END 

    IF not (isnull(@chavebusca,'')<>'' and isnull(@TipoBusca,'') = 'PEDIDO') 
     SET @SQL += ' and data_inclusao BETWEEN '''[email protected]+''' AND '''[email protected]+'''' 

    SELECT @SQL 

Можете ли вы, ребята, помочь мне узнать, что случилось?

+1

«но это не дает мне результат, который я хочу». - ну, какой результат он дал вам, и что он хотел? Примечание: то, что вы здесь, представляет собой кошмар sql-injection. Фактически вы можете использовать параметры varadic с помощью 'sp_executesql'. Окончательное значение '@ SQL' было бы полезно, чтобы помочь нам отлаживать. –

+0

Вы не обработали NULL для первых двух параметров. –

+1

Сторона примечания: вы не должны ** использовать префикс 'sp_' для ваших хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

ответ

0

Вы избегаете проверки значений NULL при конкатенации строк, поскольку NULL + string is NULL.

Например, проверьте свою первую строку:

enter image description here

должен быть:

DECLARE @SQL VARCHAR(8000) = '' 

Кроме того, следует добавить проверку для входных параметров. Например:

ISNULL(@chaveBusca, '') 
+0

Единственными параметрами, с которыми я работал, являются даты. Официальная дата и окончательная дата.Но спасибо, мне это очень помогло – Henroco

+0

Я понимаю причину, по которой вы устанавливаете @SQL varchar (100) = '', но она по-прежнему дает мне нулевую таблицу – Henroco

+0

в вашем вопросе - покажите, как вы выполняете процедуру – gotqn

0

Назначают начальное значение @sql VARCHAR (8000) = '', потому что результаты NULL + значение для NULL.

И вместо выполнения с NULL в качестве входного значения вы можете установить значение по умолчанию NULL или '' (пробел) и выполнить без входного значения.

EXEC SP_LISTA_PEDIDOS 

Попробуйте этот сценарий.

ALTER PROCEDURE SP_LISTA_PEDIDOS 
    -- EXEC SP_LISTA_PEDIDOS @Sdatainicio='Test1',@Sdatafim='Test2',@chaveBusca='Test3',@TipoBusca='Test4' 
    @Sdatainicio varchar(100) ='', 
    @Sdatafim varchar(100) ='', 
    @chaveBusca varchar(100) ='', 
    @TipoBusca varchar(100) ='' 

    AS 
    DECLARE @SQL VARCHAR(8000)='' 

    SET @SQL += 'SELECT *,b.descricao as dscstatus,c.nome as cliente ' 

    SET @SQL += ' FROM pedidos a with(nolock), ' 
    SET @SQL += ' pedidos_status b with(nolock), ' 
    SET @SQL += ' cadastro c with(nolock) ' 

    SET @SQL += ' WHERE ' 
    SET @SQL += ' a.status <> '''' and ' 
    SET @SQL += ' a.status=b.status and ' 
    SET @SQL += ' a.id_doc = c.id_doc ' 


    IF isnull(@chaveBusca,'')<>'' 
    BEGIN 

     IF isnull(@TipoBusca,'') = 'PEDIDO' 
     SET @SQL += ' and a.numped= '''[email protected]+'''' 

     IF isnull(@TipoBusca,'') = 'CLIENTE' 
     SET @SQL += ' and c.nome like '''[email protected]+'%''' 
    END 

    IF not (isnull(@chavebusca,'')<>'' and isnull(@TipoBusca,'') = 'PEDIDO') 
     SET @SQL += ' and data_inclusao BETWEEN '''[email protected]+''' AND '''[email protected]+'''' 

    SELECT @SQL 
+0

, она все равно дает мне нулевая таблица – Henroco

+0

Я получаю результат с параметром и без него ... вы изменили скрипт? –

+0

yes .. а также добавили нулевую проверку для первых 2 параметров – Henroco

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