2015-09-11 1 views
2

В SQL Server 2014 я пытаюсь создать динамическое предложение WHERE.Как передать входные параметры в sp_executesql?

Я построил запрос в виде строки, но когда я пытаюсь выполнить его с sp_executesql, я получаю следующее сообщение об ошибке: строка 13 Вы должны объявить скалярную переменную «@desde».

Я не могу понять, как получить sp_executesql для распознавания входных параметров.

ALTER PROCEDURE [dbo].[seleccionarFacturas] 
    -- Add the parameters for the stored procedure here 
    @desde char(8) = null, 
    @hasta char(8) = null, 
    @minimo int = null, 
    @ciudad int = null 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    DECLARE @tiendas varchar(max); 

    DECLARE @tablaFacturas TABLE 
    (
     fecha char(8), 
     CO char(8), 
     consecutivo varchar(max), 
     nombreCliente varchar(max), 
     ventaTotal int 
    ); 

    SET @tiendas='(ID_CO=20 OR ID_CO=22 OR ID_CO=23 OR ID_CO=27 OR ID_CO=35 OR ID_CO=39 OR ID_CO=45 OR ID_CO=48 OR ID_CO=55 OR ID_CO=58)'; 

    DECLARE @dynamicCode nvarchar(max)= 
    N' 
    SELECT 
     FECHA_DCTO, 
     ID_CO, 
     DETALLE_DOC, 
     NOM_CLI_CONTADO, 
     (SUM(TOT_VENTA)) AS ventaTotal 
    FROM 
     moda.dbo.CMMOVIMIENTO_VENTAS 
    WHERE' 
     + @tiendas + 
     N' AND FECHA_DCTO >= @desde 
     AND FECHA_DCTO <= @hasta 
    GROUP BY 
     DETALLE_DOC, ID_CO, FECHA_DCTO, NOM_CLI_CONTADO'; 

    INSERT INTO @tablaFacturas 
    EXEC [dbo].[sp_executesql] @dynamicCode; 

    SELECT * FROM @tablaFacturas 

ответ

8

Вместо

EXEC [dbo].[sp_executesql] @dynamicCode; 

Использование

EXECUTE sp_executesql @dynamicCode, 
N'@desde char(8), @hasta char(8)', 
@desde = @desde, @hasta = @hasta; 

Вы должны определить параметры, используемые в динамическом запросе, как @desde and @hasta

Пожалуйста, обратитесь sp_executesql

Else Вы можете Concat значения @desde, @hasta для динамического запроса, как

'....FECHA_DCTO >= ' + @desde + 
'AND FECHA_DCTO <= ' + @hasta + 
'GROUP BY ....' 
+0

удивительно ... :) спасибо – quelquecosa

+1

конкатенация один может быть введен. Я бы предложил использовать первый вариант, где динамический код - это что-то вроде => 'field = @ par_field ...' – Jack