SQL Server:如何在WHERE子句中使用EXECUTE sp_executesql?

时间:2015-09-11 04:25:44

标签: sql-server

我正在SQL Server 2014中编写存储过程。

我正在尝试通过在WHERE子句中执行varchar(max)作为代码来创建动态WHERE子句。

为什么不起作用?

 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)';

    SELECT
        FECHA_DCTO,
        ID_CO,
        DETALLE_DOC,
        NOM_CLI_CONTADO,
        (SUM(TOT_VENTA)) AS ventaTotal
    FROM 
        db.dbo.myTable
    WHERE
        (EXECUTE sp_executesql @tiendas) 
        AND ID_CO > 1
    GROUP BY  
        DETALLE_DOC, ID_CO, FECHA_DCTO, NOM_CLI_CONTADO

修改

为什么它仍然不起作用? 我得到这些错误(翻译,我的SQLSMS是西班牙语): - Líne4你必须声明表变量“@tablaFacturas”。 - Líne13你必须声明标量变量“@desde”。

-- 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;
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' INSERT INTO
    @tablaFacturas
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
    AND ventaTotal >= @minimo
GROUP BY  
    DETALLE_DOC, ID_CO, FECHA_DCTO, NOM_CLI_CONTADO';

EXEC [dbo].[sp_executesql] @dynamicCode;

2 个答案:

答案 0 :(得分:1)

您无法在任何地方传递EXECUTE,首先需要构建查询。

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 @sql NVARCHAR(MAX) = 
  N'SELECT
    FECHA_DCTO,
    ID_CO,
    DETALLE_DOC,
    NOM_CLI_CONTADO,
    (SUM(TOT_VENTA)) AS ventaTotal
  FROM db.dbo.myTable
  WHERE ' + @tiendas +        
  N' AND ID_CO > 1
  GROUP BY  DETALLE_DOC, ID_CO, FECHA_DCTO, NOM_CLI_CONTADO';

-- debug
SELECT @sql;

EXEC [dbo].[sp_executesql]
   @sql;

您还应该阅读 The Curse and Blessings of Dynamic SQL

修改

您尝试INSERT INTO另一个范围内的表变量。 使用Dynamic-SQL时,它将使用新范围执行。使用:

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
    AND ventaTotal >= @minimo
GROUP BY  
    DETALLE_DOC, ID_CO, FECHA_DCTO, NOM_CLI_CONTADO';


INSERT INTO @tablaFacturas
EXEC(@dynamicCode);

答案 1 :(得分:0)

也许您可以在varchar(max)中创建整个查询:

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)';

SET @Query = '
SELECT
        FECHA_DCTO,
        ID_CO,
        DETALLE_DOC,
        NOM_CLI_CONTADO,
        (SUM(TOT_VENTA)) AS ventaTotal
    FROM 
        db.dbo.myTable
    WHERE ' + @tiendas + ' AND ID_CO > 1
    GROUP BY  
        DETALLE_DOC, ID_CO, FECHA_DCTO, NOM_CLI_CONTADO';

EXEC (@Query)