簡體   English   中英

TSQL從動態sql中選擇到臨時表

[英]TSQL select into Temp table from dynamic sql

這看起來相對簡單,但顯然並非如此。

我需要通過 select into 語法基於現有表創建一個臨時表:

SELECT * INTO #TEMPTABLE FROM EXISTING_TABLE

問題是,現有的表名是通過參數接受的......

我可以通過以下方式獲取表的數據:

execute ('SELECT * FROM ' + @tableName)

但是我如何將兩者結合起來,以便我可以將執行的結果直接放入臨時表中。

這將用於每個表的列不相同,因此在獲取數據之前構建臨時表是不切實際的。

除了使用全局臨時表之外,我願意接受任何建議。

更新:

這完全是荒謬的,但我對全局臨時表的保留意見是,這是一個多用戶平台,如果表會長時間逗留,它會導致問題......

Sooo .. 只是為了通過這部分我已經開始使用執行來生成一個全局臨時表。

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

然后我使用全局臨時表加載本地臨時表:

select * into #tempTable from ##globalDynamicFormTable

然后我刪除全局表。

drop table ##globalDynamicFormTable

這很臟,我不喜歡它,但就目前而言,在我找到更好的解決方案之前,它必須起作用。

到底:

我想沒有辦法繞過它。

最好的答案似乎是;

在執行命令中創建一個視圖並使用它來加載存儲過程中的本地臨時表。

在執行命令中創建一個全局臨時表並使用它來加載本地臨時表。

話雖如此,我可能只會堅持使用全局臨時表,因為在我的組織中對創建和刪除視圖進行了審核,而且我確信他們會質疑它是否一直發生。

謝謝!

一個工作示例。

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
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;

我是如何使用動態 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
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

看看OPENROWSET ,然后執行以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM