将表名作为参数传递给存储过程
Posted
技术标签:
【中文标题】将表名作为参数传递给存储过程【英文标题】:Pass a table name to stored procedure as a parameter 【发布时间】:2017-11-27 17:39:46 【问题描述】:这是我的存储过程,正在运行:
/*
@CRM_Ref - This is the only required input port for this SP
@North_Ref - Output port, returns the North_Ref for a valid CRM_Ref input
@Output_Message - Output port, Returns the output of the SP, either 'Success' or 'North_Ref not found'
*/
ALTER PROCEDURE [dbo].sp_Get_North_Reference
@CRM_Ref NVARCHAR(255),
@North_Ref VARCHAR(255) OUTPUT,
@Output_Message VARCHAR(255) OUTPUT
AS
DECLARE @var_North_Ref VARCHAR(255); -- Variable used to store the North_Ref
DECLARE @var_Output_Message VARCHAR(255); -- Variable to carry the Output_Message
DECLARE @COUNTER INT; -- Counter for the amount of times the while loop should run
SET @COUNTER = 100;
-- Loop will run 10 times with a 10 second delay between each loop
WHILE @COUNTER >= 1
BEGIN
SET @var_North_Ref = (SELECT TOP 1 North_Ref FROM DEV.dbo.Address__ADDRESS WHERE CRM_Ref = @CRM_Ref ORDER BY PUBLICATION_INSTANCE_DATE DESC)
IF @var_North_Ref IS NULL
BEGIN
SET @COUNTER = @COUNTER - 1; -- Counter is decremented by 1
SET @var_Output_Message = 'North_Ref not found';
WAITFOR DELAY '00:00:10'; -- Wait is triggered if no North_Ref is found
END
ELSE
BEGIN
SET @COUNTER = 0; -- Counter is set to 0 to end the while loop
SET @var_Output_Message = 'Success';
END
END
SET @Output_Message = @var_Output_Message; -- Format Output_Message
SET @North_Ref = @var_North_Ref; -- Format North_Ref
;
GO
我想在这个存储过程 (@TableName VARCHAR(255)
) 中添加另一个参数,我想将它传递给 SELECT
语句。
所以我想要类似的东西:
SELECT TOP 1 North_Ref
FROM @Table_Name
WHERE CRM_Ref = @CRM_Ref
ORDER BY PUBLICATION_INSTANCE_DATE DESC
我已经尝试按照上面的方法执行此操作,但我遇到了错误,因为我认为您不能在存储过程中使用参数作为表名
【问题讨论】:
你需要dynamic SQL。 如果您传入表名,则必须使用动态 sql。当我看到这一点时,我总是担心使用表中的列会比所有保存相同数据的不同表更好。而等待 10 秒的 while 循环对我来说是一个巨大的危险信号。最后但同样重要的是,您应该阅读此内容。 sqlperformance.com/2012/10/t-sql-queries/sp_prefix @RigertaDemiri 你能提供一个例子吗?谢谢 我评论中链接的主题是一个简单的例子。祝你好运! 问题是数据访问需要快速。你写这个的方式是它会延迟执行 10 秒。为什么????您是否试图无缘无故减慢系统速度?为什么不改变逻辑,这样你就不需要遍历你的表了?只需第一次选择您想要的行并完成它。如果没有找到行,则没有找到行。延迟10秒再试,有点奇怪。 【参考方案1】:试试这个概念怎么样:
CREATE TABLE #tempTable(abc int);
declare @strSQL nvarchar(255)
SET @strSQL = 'insert into #tempTable select 123'
EXEC sp_executesql @strSQL
declare @abc int
select top 1 @abc = abc from #tempTable
drop table #tempTable
select @abc
【讨论】:
以上是关于将表名作为参数传递给存储过程的主要内容,如果未能解决你的问题,请参考以下文章