在确定了临时表列大小的行数后?

时间:2016-02-18 19:38:53

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

确定临时表列大小的行数是多少?

例如,假设以下查询返回10,000行:

select Name, LastName, Resume into #temp from Employee

表Employee中的所有三列都是varchar,但Employee.Resume(varchar(500))的范围可以从20个字符到400个字符。如果我在没有INTO子句的情况下运行该查询,我将看到较长的Employee.Resume值几乎位于10,000行的末尾。

在将结果转储到临时表时,INTO子句是否考虑整个结果集?或者它是否使用前X行来确定大小?或者它只是“继承”原始表中的列大小?

我几乎可以肯定,自从我查询tempdb.sys.columns后,它会复制原始列中的尺寸,但我只是想检查一下。

感谢。

2 个答案:

答案 0 :(得分:3)

它复制原始列的数据类型。它不会尝试对数据长度或精度进行任何平均。有一些与FILESTREAM(已转换为VARBINARY(MAX))和IDENTITY列(有时未保留)相关的例外情况

来自MSDN

  

new_table的格式是通过评估选择列表中的表达式来确定的。 new_table中的列按选择列表指定的顺序创建。 new_table中的每一列都具有与选择列表中相应表达式相同的名称,数据类型,可为空性和值。除了在"使用标识列和#34;中定义的条件之外,将传输列的IDENTITY属性。在备注部分。

     

...

     

数据类型

     

FILESTREAM属性不会传输到新表。 FILESTREAM BLOB被复制并作为varbinary(max)BLOB存储在新表中。如果没有FILESTREAM属性,varbinary(max)数据类型的限制为2 GB。如果FILESTREAM BLOB超过此值,则引发错误7119并停止语句。

     

当在新表中选择现有标识列时,新列将继承IDENTITY属性,除非满足下列条件之一:

     
      
  • SELECT语句包含连接。

  •   
  • 使用UNION连接多个SELECT语句。

  •   
  • 标识列在选择列表中列出多次。

  •   
  • 标识列是表达式的一部分。

  •   
  • 标识列来自远程数据源。

  •   
     

如果这些条件中的任何一个为真,则会创建非NULL NULL列   继承IDENTITY属性。如果新表中需要标识列但是此列不可用,或者您希望种子或增量值与源标识列不同,请使用IDENTITY函数在选择列表中定义列。请参阅"使用IDENTITY功能创建标识列"在下面的示例部分中。

答案 1 :(得分:2)

正如Microsoft网站上针对INTO子句所述:

  

new_table的格式是通过评估表达式来确定的   选择列表。 new_table中的列按顺序创建   由选择列表指定。 new_table中的每一列都具有相同的列   名称,数据类型,可空性和值作为对应的   表达式在选择列表中。

在您的特定实例中,数据类型将是基础列的数据类型(在本例中为VARCHAR(500))。如果要对列添加另一个字符串(例如'RESUME: ' + E.resume),则SQL Server可能会根据表达式数据类型的常规规则更改数据类型。您也可以在Microsoft网站上找到这些规则。