我希望此程序在执行时更改表名。
我想要更改的表名是Recargas_@mes
有一些方法可以做到吗?
@MES DATETIME
AS
BEGIN
SELECT CUENTA, SUM(COSTO_REC) COSTO_REC
INTO E09040_DEV.BI_PRO_COSTO_RECARGAS
FROM (
SELECT a.*,(CASE
WHEN COD_AJUSTE IN ('ELEC_TEXT','TFREPPVV_C') THEN (A.VALOR)*(R.COSTO) ELSE 0 END)
FROM Recargas_@MES AS A, BI_PRO_LISTA_COSTOS_RECARGAS AS R
WHERE R.ANO_MES = @MES
) D
GROUP BY CUENTA
END
答案 0 :(得分:1)
示例代码:
-- Declare variables
DECLARE @MES DATETIME;
DECLARE @TSQL NVARCHAR(MAX);
-- Set the variable to valid statement
SET @TSQL = N'
SELECT CUENTA, SUM(COSTO_REC) AS COSTO_REC
INTO E09040_DEV.BI_PRO_COSTO_RECARGAS
FROM (
SELECT A.*,
(CASE
WHEN COD_AJUSTE IN (''ELEC_TEXT'',''TFREPPVV_C'') THEN
(A.VALOR)*(R.COSTO)
ELSE 0
END)
FROM
Recargas_' + REPLACE(CONVERT(CHAR(10), @MES, 101), '/', '') + ' AS A,
BI_PRO_LISTA_COSTOS_RECARGAS AS R
WHERE R.ANO_MES = ' + CONVERT(CHAR(10), @MES, 101) + '
) D
GROUP BY CUENTA'
-- Execute the statement
EXECUTE (@SQL)
有些注意事项:
1 - 我假设表名有某种类型的扩展名是日期吗?我使用了MM / DD / YYYY并删除了斜杠作为后缀的格式。
2 - WHERE子句仅在您不使用变量的时间部分时才有效。
例如,03/15/2016 00:00:00将是没有时间输入的日期。如果没有,您将不得不使用> =和<抓住特定日子的所有时间。
3 - 您正在使用此代码动态创建表格。在第二次执行时,除非丢弃表,否则将出现错误。
4 - 在将表A连接到表R时,您没有使用ON子句。要符合ANSI标准,请将WHERE子句移动到ON子句。
5 - CASE语句创建的实际计算不会给出列名。
由于我没有详细的业务要求,因此必须解决问题3到5。 玩得开心。
答案 1 :(得分:0)
它应该使用dynamic SQL
来允许放置动态表名:
DECLARE @SQL NVARCHAR(MAX) = N'
SELECT CUENTA, SUM(COSTO_REC) COSTO_REC
INTO E09040_DEV.BI_PRO_COSTO_RECARGAS
FROM (
SELECT a.*,(CASE
WHEN COD_AJUSTE IN (''ELEC_TEXT'',''TFREPPVV_C'') THEN (A.VALOR)*(R.COSTO) ELSE 0 END)
FROM Recargas_' + @MES + ' AS A, BI_PRO_LISTA_COSTOS_RECARGAS AS R
WHERE R.ANO_MES = ' + CAST(@MES AS VARCHAR(32)) + '
) D
GROUP BY CUENTA'
EXECUTE (@SQL)