2012-12-01 50 views
0

我要創建SQL Server中的動態臨時表,總部設在列的列表,例如,我有一個具有列的許多名字表ListOfColumns內是指實際表格動態臨時表

ListOfColumns 
ColumnNameA 
ColumnNameB 
ColumnNameC 

我創建一個函數來得到一個字符串,在這種格式的這些列:

"ColumnNameA, ColumnNameB, ColumnNameC" 

現在我需要根據那些叫做報告一個真實的表列創建我的臨時表。我可以有更多或更少的列(其動態報告列生成器)

我需要做一個動態SQL,我沒有每列的數據類型,我想創建一個臨時表與動態SQL和繼承我的報表的數據類型。有沒有辦法做到這一點?

順便說一句......我不想使用全局變量。 謝謝。

回答

0

如果,例如,您的報告表看起來是這樣的:

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' 

並且您應該使用正確的列創建表t YPES。要測試它,插入一行然後查詢它。

insert into ReportTemp values ('abc', 1, 2); 
select * from ReportTemp; 

要查看此實際情況,請查看此sql fiddle

請注意,這將而不是攜帶約束,索引等 - 只是列名稱和類型。

+0

Thanks @ibrahim但ReportTemp並非臨時表,我不想根據您的示例創建物理表,我想創建臨時表。 – rgx71

+0

您可以在表名之前添加散列,並將其作爲臨時表創建。 – Isaac

+0

但我無法插入或查詢它,甚至在程序中! – Isaac

0

您無法創建動態臨時表。

原因是臨時表與SQL會話相關聯。當您執行動態SQL時,它會創建一個會話結束時終止的新會話。所以,表格在exec期間被創建。然後當控制返回到調用過程時,它被放棄(或者超出上下文)。

這裏有一些變通,沒有一個你可能會喜歡:

  1. 與規範前綴創建表,如「_」來表示工作表。然後在存儲過程中刪除這個表,並在幾乎所有情況下捕獲異常。
  2. 用所有可能的列值創建一個臨時表。
  3. 爲這些工作表創建您自己的「臨時」數據庫。
  4. 使用通用列名稱並保留這些通用列與其他地方的列之間的對應關係。