将表名作为参数传递给存储过程

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

【讨论】:

以上是关于将表名作为参数传递给存储过程的主要内容,如果未能解决你的问题,请参考以下文章

存储过程,将表名作为参数传递

在 azure synapse 存储过程中将表名作为参数传递时将查询结果分配给变量

将表值参数传递给存储过程

使用 PetaPoco 将表值参数传递给存储过程

如何从.net代码将表值参数传递给存储过程

将表中的列值作为参数传递给存储过程 sql