TSQL从动态sql中选择Temp表

时间:2012-03-02 14:33:48

标签: sql sql-server tsql temp-tables

这似乎相对简单,但显然不是。

我需要通过select into语法创建一个基于现有表的临时表:

SELECT * INTO #TEMPTABLE FROM EXISTING_TABLE

问题是,现有的表名是通过参数...

接受的

我可以通过以下方式获取表格数据:

execute ('SELECT * FROM ' + @tableName)

但是如何将这两者结合起来以便我可以将执行结果直接放入临时表中。

将要使用的每个表的列都不相同,因此在获取数据之前构建临时表是不切实际的。

除了使用全局临时表之外,我对任何建议持开放态度。

更新

这是完全荒谬的,但我对全球临时表的保留意见是,如果桌子会长时间停留,这是一个多用户平台会产生问题......

Sooo ..只是为了通过这个部分,我已经开始使用execute生成一个全局临时表。

execute('select * into ##globalDynamicFormTable from ' + @tsFormTable) 

然后我使用全局临时表来加载本地临时表:

select * into #tempTable from ##globalDynamicFormTable

然后删除全局表。

drop table ##globalDynamicFormTable

这很脏,我不喜欢它,但暂时,直到我得到一个更好的解决方案,它必须工作。

最后:

我想没有办法绕过它。

最佳答案似乎是;

在execute命令中创建视图,并使用它在存储过程中加载本地临时表。

在execute命令中创建全局临时表,并使用它来加载本地临时表。

据说我可能会坚持使用全局临时表,因为在我的组织中审核创建和删除视图,我相信如果它一直开始发生,他们会质疑。

谢谢!

5 个答案:

答案 0 :(得分:21)

一个工作示例。

DECLARE @TableName AS VARCHAR(100)
SELECT @TableName = 'YourTableName'

EXECUTE ('SELECT * INTO #TEMP  FROM ' + @TableName +'; SELECT * FROM #TEMP;')

具有可访问临时表的第二个解决方案

DECLARE @TableName AS VARCHAR(100)
SELECT @TableName = 'YOUR_TABLE_NAME'

EXECUTE ('CREATE VIEW vTemp AS
        SELECT *
        FROM ' + @TableName)
SELECT * INTO #TEMP  FROM vTemp 

--DROP THE VIEW HERE      
DROP VIEW vTemp

/*START USING TEMP TABLE
************************/
--EX:
SELECT * FROM #TEMP


--DROP YOUR TEMP TABLE HERE
DROP TABLE #TEMP

答案 1 :(得分:1)

declare @sql varchar(100);

declare @tablename as varchar(100);

select @tablename = 'your_table_name';

create table #tmp 
    (col1 int, col2 int, col3 int);

set @sql = 'select aa, bb, cc from ' + @tablename;

insert into #tmp(col1, col2, col3) exec @sql;

select * from #tmp;

答案 2 :(得分:0)

我是如何在动态sql中使用数据透视图(#AccPurch是在此之前创建的)

DECLARE @sql AS nvarchar(MAX)
declare @Month Nvarchar(1000)

--DROP TABLE #temp
select distinct YYYYMM into #temp from #AccPurch AS ap
SELECT  @Month = COALESCE(@Month, '') + '[' + CAST(YYYYMM AS VarChar(8)) + '],' FROM    #temp

SELECT   @Month= LEFT(@Month,len(@Month)-1)


SET @sql = N'SELECT UserID, '+ @Month + N' into ##final_Donovan_12345 FROM (
Select ap.AccPurch ,
       ap.YYYYMM ,
       ap.UserID ,
       ap.AccountNumber
FROM #AccPurch AS ap 
) p
Pivot (SUM(AccPurch) FOR YYYYMM IN ('+@Month+ N')) as pvt'


EXEC sp_executesql @sql

Select * INTO #final From ##final_Donovan_12345

DROP TABLE  ##final_Donovan_12345

Select * From #final AS f

答案 3 :(得分:0)

DECLARE @count_ser_temp int;
DECLARE @TableName AS VARCHAR(100)
SELECT @TableName = 'TableTemporal'

EXECUTE ('CREATE VIEW vTemp AS
    SELECT *
    FROM ' + @TableTemporal)
SELECT TOP 1 * INTO #servicios_temp  FROM vTemp

DROP VIEW vTemp

-- Contar la cantidad de registros de la tabla temporal
SELECT @count_ser_temp = COUNT(*) FROM #servicios_temp;

-- Recorro los registros de la tabla temporal 
WHILE @count_ser_temp > 0
 BEGIN
 END
END

答案 4 :(得分:-1)

查看OPENROWSET,并执行以下操作:

SELECT * INTO #TEMPTABLE FROM OPENROWSET('SQLNCLI'
     , 'Server=(local)\SQL2008;Trusted_Connection=yes;',
     'SELECT * FROM ' + @tableName)