【问题标题】:send a table name variable to a stored procedure将表名变量发送到存储过程
【发布时间】:2017-03-07 19:05:14
【问题描述】:

我尝试这样做,但我做不到,请帮助:

将表名作为变量发送到存储过程,以对该变量进行选择查询。示例:

USE [Andes]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[epesos_ing_log]*/
@Tbl_OC_Llamada VARCHAR(128),-- TABLE's NAME
@Tbl_Est_Llamada VARCHAR(128) ,-- TABLE's NAME
@tbl_Resul_Llamada VARCHAR(128) -- TABLE's NAME

as

select  iId, 
        datepart(year, dFechaHora) as año_periodo, 
        datepart(MM, dFechaHora) as mes_periodo, 
        cast(dFechaHora as date) as dFecha, 
        datepart(HH, dFechaHora) as T_hora, 
        dFechaHora, dFin, 
        datediff (second, dFechaHora, dFin) as tiempo,
        sNumeroTelefono, 
        'Emisión Ext' as tipo, 
        (iAgenteEmisor) as Agente

from @Tbl_OC_Llamada 
    inner join @Tbl_Est_Llamada 
    on ELL.id_estado = T.iUltimoEstado
    inner join @tbl_Resul_Llamada 
    on RLL.id_res_llamada = T.iResultadoLlamada   

where sDireccion = 's' 
    and len (sNumeroTelefono) > 4
    and desc_estado in ('Hablando','Iniciada')
    and iAgenteEmisor in (select cod_ejecutiva
     from andes.dbo.BORRADOR_EJECUTIVA)

【问题讨论】:

  • 你不能那样做。您必须为此使用动态 SQL……但是您到底想做什么?您已在 proc 中硬编码表的连接条件。如果您没有以正确的表格和正确的顺序传递,您的整个过程将会中断。为什么还要接受参数呢?
  • 谢谢你的澄清,参数是,据说是我尝试使用的表的名称
  • 你不能在 sql 中参数化标识符,但即使你可以,这意味着如果你将错误的表名传递给这个过程,它会引发一个错误,因为所有的列名(和值)是硬编码的。
  • 这通常表明数据模型损坏 - 当您有多个具有相同结构的表时,通常表明它们应该是一个包含一个或多个包含附加数据的列的表(通常,你会发现一些应该建模为data的东西被建模为metadata,比如嵌入到表names中)

标签: sql tsql sql-server-2014


【解决方案1】:

这是一个可以通过使用动态 SQL 来解决的问题。 请看这个问题的答案:Table name as variable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多