簡體   English   中英

動態溫度表

[英]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期間創建的。 然后,當控制權移回到調用過程時,它就被丟棄(或脫離上下文)。

以下是一些變通辦法,您可能都不喜歡它們:

  1. 創建一個具有規范前綴的表,例如“ _”以代表工作表。 然后將此表放入存儲過程中,並捕獲異常以在幾乎所有情況下都將其刪除。
  2. 用所有可能的列值創建一個臨時表。
  3. 為此類工作表創建自己的“臨時”數據庫。
  4. 使用通用列名稱,並保持這些通用列與其他列之間的對應關系。

暫無
暫無

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

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