【问题标题】:How do I create a temporary table from a type?如何从类型创建临时表?
【发布时间】:2014-01-15 01:54:05
【问题描述】:

假设我有某种类型:

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

【问题讨论】:

  • 您想要一个临时表,它的列也是一个表?
  • @BrendanGreen 我想要一个与类型使用相同结构的表。
  • 当你说它不起作用时,你看到了什么错误消息或输出?

标签: sql sql-server sql-server-2008


【解决方案1】:

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

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

现在,#superBrand 应该匹配表类型的表结构,减去约束(以及少量有用的二级索引,从 SQL Server 2014 开始)。

当然,填充#temp 表的其余代码必须知道结构。那么,声明一个与表类型具有相同结构的#temp 表的目的究竟是什么?

【讨论】:

  • 嗯,我使用类型作为过程的参数,我还想用它来声明一些将要创建的表。它本质上是避免重新定义类型的捷径。有没有更好的办法?
  • 请注意,这种方式会导致重新编译,因为临时表不是静态声明的。
  • 静态代码分析失败。 “ABC.PROC.SQL(11,9,11,9):StaticCodeAnalysis 错误:SR0001:Microsoft.Rules.Data:SELECT * 语句生成的结果集的形状将在基础表或视图结构发生变化时发生变化。 "
  • @Koshimitsu 所以?你需要选择你想要的:能够创建一个基于“现在”版本的表的结构的#temp 表,或者通过所有静态代码分析。根据定义,你不能同时拥有两者。我的猜测是这个OP更关心前者而不是后者,但是如果你认为你可以提供一个完全满足这个问题要求的解决方案并且通过静态代码分析,请务必发布一个答案。
【解决方案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)

【讨论】:

  • 这会创建一个表变量而不是一个临时表
猜你喜欢
  • 2023-03-22
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 2022-11-22
  • 2011-11-03
  • 1970-01-01
  • 2018-12-26
相关资源
最近更新 更多