在SQL Server过程中更改表名

时间:2016-03-15 21:59:51

标签: sql-server tsql stored-procedures

我希望此程序在执行时更改表名。

我想要更改的表名是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

2 个答案:

答案 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)