[英]Dynamic temp table
我必須在SQL Server中基於列列表創建一個動態臨時表,例如,我有一個表ListOfColumns,該表中有許多引用真實表的列名
ListOfColumns
ColumnNameA
ColumnNameB
ColumnNameC
我創建一個函數來獲取所有具有以下格式的列的字符串:
"ColumnNameA, ColumnNameB, ColumnNameC"
現在,我需要基於稱為報表的真實表中的列創建臨時表。 我可以有更多或更少的列(它是一個動態報告列生成器)
我需要做一個動態SQL,我沒有每一列的數據類型,我想用動態sql創建一個臨時表並繼承Report表的數據類型。 有什么辦法嗎?
順便說一句...我不想使用全局變量。 謝謝。
例如,如果您的報表表看起來像這樣:
create table Report (
ColumnNameA varchar(4),
ColumnNameB integer,
ColumnNameC integer,
ColumnNameD varchar(8),
ColumnNameE bit,
ColumnNameF integer
);
您可以創建以下過程:
create proc copy_table @col_names varchar(128)
as
DECLARE @SQLQuery AS NVARCHAR(500)
SET @SQLQuery = 'SELECT ' + @col_names + ' into ReportTemp from Report where 1 = 0'
EXEC(@SQLQuery);
並使用您用逗號分隔的列字符串進行調用,如下所示:
exec copy_table @col_names = 'ColumnNameA, ColumnNameB, ColumnNameC'
並且您應該使用正確的列類型創建表。 要對其進行測試,請插入一行然后進行查詢。
insert into ReportTemp values ('abc', 1, 2 );
select * from ReportTemp;
要查看實際效果,請查看此sql小提琴 。
請注意,這不會繼承約束,索引等-僅保留列名和類型。
您無法創建動態臨時表。
原因是臨時表與SQL會話相關聯。 當您執行動態SQL時,它將創建一個新會話,該會話在會話結束時終止。 因此,該表是在exec
期間創建的。 然后,當控制權移回到調用過程時,它就被丟棄(或脫離上下文)。
以下是一些變通辦法,您可能都不喜歡它們:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.