存储过程:将表名转换为表变量
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 等调用者的元数据,以及它们如何妨碍计划缓存。我看到的临时表的唯一真正用途是如果您需要比主键更复杂的索引,因为这是表变量的唯一选择。以上是关于存储过程:将表名转换为表变量的主要内容,如果未能解决你的问题,请参考以下文章