如何在存储过程中使用动态表名编写 Select 查询?

Posted

技术标签:

【中文标题】如何在存储过程中使用动态表名编写 Select 查询?【英文标题】:How to write Select query with dynamic table name in Stored Procedure? 【发布时间】:2016-10-25 07:10:16 【问题描述】:

我正在编写一个存储过程。但是在这个过程中表名是动态的。我想从我的变量表中获取行号。但是我将在哪里设置 @rownumber 并返回选择查询?

Create Proc update_eMail
    (@tablename nvarchar(50),
     @columnname nvarchar(50))
AS
Begin 

    Declare @q_getrowNumber NVARCHAR(MAX)
    Declare @rownumber int
    SELECT @rownumber =  Count(ID) FROM  quotename(@tablename) // doesnt work

END

提前致谢

【问题讨论】:

【参考方案1】:

这是使用动态 sql 实现目标的一种方法

declare @sql NVARCHAR(4000)= ''

set @sql = 'SELECT @rownumber = Count(ID) FROM '+ quotename(@tablename) 

exec sp_executesql @sql, N'@rownumber int output',@rownumber output

【讨论】:

我像这样更新,但代码在这一行完成:''exec sp_executesql @sql,N'@rownumber int output',@rownumber output''我的其余代码不起作用。 【参考方案2】:

您为动态查询编写了错误的过程 试试这个。它会起作用的。

ALTER PROC update_eMail(@tablename NVARCHAR(50))
AS
BEGIN 
DECLARE @RowNumber NVARCHAR(MAX)=''

  set @RowNumber='select Count(ID) FROM '+@tablename+''
  exec(@RowNumber)
END

或在您的查询中尝试以下代码

ALTER PROC update_eMail1
(
   @tablename NVARCHAR(50)
)
AS
BEGIN
     DECLARE @sql NVARCHAR(4000)= '',@rownumber INT
     SET @sql = 'SELECT @rownumber = Count(ID) FROM '+quotename(@tablename) 

   EXEC sp_executesql @sql, N'@rownumber int output',@rownumber OUTPUT

   SELECT @rownumber

END

【讨论】:

如果我在 'EXEC' 代码行之后写一些代码,它可以工作吗?是否在一个存储过程中只运行一种 EXEC 方法? 是的,它有效。您可以在“Exec”代码行之后编写代码。 您可以在另一个存储过程中运行多个存储过程,其上限为 32 级 超过最大存储过程、函数、触发器或视图嵌套级别(限制 32)【参考方案3】:

这对你来说是最简单的:

Create Proc update_eMail
    @tablename nvarchar(50)
AS
Begin 
    EXEC ( 'SELECT Count(ID) FROM '+@tablename+'')
END

【讨论】:

以上是关于如何在存储过程中使用动态表名编写 Select 查询?的主要内容,如果未能解决你的问题,请参考以下文章

sql server存储过程如何动态生成表名

FOR中的SQL查询动态表名

SQL 查表名?

如何在存储过程中动态传递表名 - ORACLE [重复]

mysql 从动态表名中查询数据

mysql 动态传入表名参数的存储过程写法