如何从类型创建临时表?

16
假设我有一些类型:
CREATE TYPE usr.NameList AS TABLE ([name] VARCHAR(MAX) NOT NULL);

现在我想基于这个类型创建一个临时表,该怎么做?

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

Also, from this: 基于用户定义类型创建表
CREATE TABLE #superBrand OF usr.NameList -- doesn't work

你想要一个临时表,其中有一列也是一个表吗? - Brendan Green
@BrendanGreen 我想要一个使用与类型相同结构的表格。 - quant
1
当你说它不起作用时,你看到了什么错误消息或输出? - Brendan Green
2个回答

25

Pure.Krome的回答展示了如何使用表变量而不是#temp表。如果你真的想要一个基于已知表类型的#temp表(而不必知道列名/定义),你可以这样说:

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

现在, #superBrand 应该与表类型的表结构匹配,减去约束(以及 SQL Server 2014 开始逐渐有用的次要索引)。

当然,随后填充 #temp 表的其余代码将需要了解结构。那么,声明一个与表类型具有相同结构的 #temp 表的目的是什么?


1
我将类型用作过程的参数,并且还想使用它来声明一些将要创建的表。这实际上是一种快捷方式,以避免重新定义类型。有更好的方法吗? - quant
请注意,这种方法会导致重新编译,因为临时表没有静态声明。 - Mark Sowul
这不符合静态代码分析。"ABC.PROC.SQL(11,9,11,9):StaticCodeAnalysis错误:SR0001:Microsoft.Rules.Data:如果基础表或视图结构发生更改,则SELECT *语句生成的结果集的形状将发生变化。" - Koshimitsu
1
@Koshimitsu 那么呢?你需要选择你想要的:能够创建一个基于“现在”版本表结构的#temp表,还是通过所有静态代码分析。从定义上来说,你不能真正拥有两者。我猜这个OP更关心前者而不是后者,但如果你认为你可以提供一个完全满足这个问题要求并通过静态代码分析的解决方案,请发表一个答案。 - Aaron Bertrand

-2
/****** 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
这将创建一个表变量而不是临时表。 - Mark Sowul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接