存储过程:将表名转换为表变量

Posted

技术标签:

【中文标题】存储过程:将表名转换为表变量【英文标题】:Stored Procedure: turn Table name into Table Variable 【发布时间】:2014-06-04 11:24:51 【问题描述】:

有很多类似的问题,但是我没有找到我要找的东西。 由于在存储过程中使用动态 SQL 会很快变得很麻烦,因此我想将表名 (Varchar) 传递给存储过程,将该表名转换为表变量,然后在该过程的其余部分使用该表变量。 我不知道这个的代码。

我正在使用 SQL Server 2008R2 上的 SSMS。目前我的代码看起来与此类似。我滞后中间部分从@TableName Varchar 变量创建@Table 表变量

CREATE Procedure [dbo].StoredProc(@Tablename Varchar)
AS
Begin
Declare @Table Table (ColA Varchar, ColB Float)
Declare @result float

-- Something like Insert @Table Select * From @Tablename using Dynamic sql or sth. similar

Select @result = Select sum(ColB) From @Table
End

【问题讨论】:

查看这个帖子***.com/questions/5877207/… 我见过这个,但我不明白,这个执行的选择查询的结果存储在哪里,以及我如何在过程的稍后阶段访问这个结果集。 看看这个***.com/questions/803211/… 【参考方案1】:

您可以通过以下方式将动态 SQL 和临时表存储结合起来:

CREATE Procedure [dbo].StoredProc(@Tablename Varchar(100))
    AS
    Begin
    create table #TempTbl (ColA Varchar(100), ColB Float);
    Declare @result float

    declare @dynSQL varchar(max);
    select @dynSQL = 'insert into #TempTbl select 
      cast(val1 as varchar(100)) as ColA, 
      cast(val2 as float) as ColB from ' + COALESCE( @Tablename, 'NULL');
    -- Tablename should contain schema name, 'dbo.' for example
    exec( @dynSQL );
    Select @result = sum(ColB) From #TempTbl
    drop table #TempTbl;
    return @Result;
    End

【讨论】:

只需将您的代码构建到我的程序中即可,效果很好。非常感谢你。不过不太清楚 COALESCE 的附加价值是什么。 COALESCE 部分添加以确保您免受 NULL 值 @tablename 的 NULL @dynSQL 值。应始终小心通过连接变量(可以为 NULL)形成动态 SQL。请记住,它总是会导致您执行 NULL sql 字符串。【参考方案2】:

你应该在一个变量中设置你需要的语句:

 SET @sqlString='INSERT ' + @Table + ' SELECT * FROM ' + @Tablename

使用动态 sql 或某事。类似”

然后执行:

 EXEC sp_executesql @sqlString 

【讨论】:

我怀疑它会起作用。关于本地@Table变量的动态SQL语句donno【参考方案3】:
USE AdventureWorks2012;

DECLARE @TableName NVARCHAR(MAX);

DECLARE @Copy TABLE
(
    [ShiftID] [tinyint] NOT NULL,
    [Name] [dbo].[Name] NOT NULL,
    [StartTime] [time](7) NOT NULL,
    [EndTime] [time](7) NOT NULL,
    [ModifiedDate] [datetime] NOT NULL
);

SET @TableName = N'[HumanResources].[Shift]';

INSERT INTO @Copy
EXEC ('SELECT * FROM ' + @TableName);

SELECT * FROM @Copy;

【讨论】:

这种方法也很有效,实际上更接近我的问题,因为我想要一个表变量而不是临时表。我也用表变量测试了我的程序,结果证明运行时(在我的例子中)与表变量和临时表完全相同。我个人使用临时表来实现。 是的,临时表和表变量最终是相同的。我只是很少再使用临时表,因为缺少返回给 SSIS、s-s-rS、.Net 等调用者的元数据,以及它们如何妨碍计划缓存。我看到的临时表的唯一真正用途是如果您需要比主键更复杂的索引,因为这是表变量的唯一选择。

以上是关于存储过程:将表名转换为表变量的主要内容,如果未能解决你的问题,请参考以下文章

在sql存储过程中传递表名

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

mysql 存储过程 动态表名

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

在 mysql sproc 中使用表名的变量

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