2014-01-15 62 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

这会创建一个表变量而不是临时表 –