2014-01-15 97 views
5

假設我有一些類型:如何從一個類型創建一個臨時表?

CREATE TYPE usr.NameList AS TABLE ([name] VARCHAR(MAX) NOT NULL); 

,現在我想創建一個基於此類型的臨時表,我該怎麼辦呢?

CREATE TABLE #superBrand (usr.NameList) -- doesn't work 

另外,從這樣的:create table based on a user defined type

CREATE TABLE #superBrand OF usr.NameList -- doesn't work 
+0

你想要一個臨時表的列也是一個表? –

+0

@BrendanGreen我想要一個與該類型使用相同結構的表格。 – arman

+0

當你說它不起作用時,你看到了什麼錯誤信息或輸出? –

回答

9

Pure.Krome's answer顯示瞭如何使用表變量而不是一個#temp表的。如果你真的想根據已知的表類型#TEMP表(而不必知道列名/定義),你可以說:

DECLARE @d usr.NameList; 
SELECT * INTO #superBrand FROM @d; 

現在,#superBrand應符合表類型的表結構,減去約束(以及從SQL Server 2014開始的邊緣有用的二級索引)。

當然,然後填充#temp表的其餘代碼將不得不知道結構。那麼,聲明具有與表類型相同結構的#temp表的目的究竟是什麼?

+0

那麼我使用該類型作爲過程的參數,我也想用它來聲明一些將要創建的表。它本質上是避免重新定義類型的捷徑。有沒有更好的辦法? – arman

+0

請注意,這種方式會導致重新編譯,因爲臨時表未被靜態聲明。 –

+0

這會導致靜態代碼分析失敗。 「ABC.PROC.SQL(11,9,11,9):StaticCodeAnalysis錯誤:SR0001:Microsoft.Rules.Data:如果基礎表或視圖結構更改,則由SELECT *語句生成的結果集的形狀將更改。 「 – Koshimitsu

0
/****** Object: UserDefinedTableType [dbo].[IdentityType] ******/ 
CREATE TYPE [dbo].[IdentityType] AS TABLE(
    [Id] [int] NOT NULL, 
    PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (IGNORE_DUP_KEY = OFF) 
) 
GO 




DECLARE @IdTable [dbo].[IdentityType] 
INSERT INTO @IdTable VALUES(1) 
+1

這會創建一個表變量而不是臨時表 –