确定临时表列大小的行数是多少?
例如,假设以下查询返回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
后,它会复制原始列中的尺寸,但我只是想检查一下。
感谢。
答案 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网站上找到这些规则。