我正在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;
答案 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)