【发布时间】: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