Sql 临时表列大小在确定了多少行之后?
临时表列大小在确定了多少行之后 例如,假设以下查询返回10000行:Sql 临时表列大小在确定了多少行之后?,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,临时表列大小在确定了多少行之后 例如,假设以下查询返回10000行: select Name, LastName, Resume into #temp from Employee Employee表中的所有三列都是varchar,但是Employee.Resume(varchar(500))的范围从20个字符到400个字符。如果我在没有INTO子句的情况下运行该查询,我将看到较长的Employee.Resume值几乎位于10000行的末尾 当将结果转入临时表时,IN子句是否考虑整个结果集?还是
select Name, LastName, Resume into #temp from Employee
Employee表中的所有三列都是varchar,但是Employee.Resume(varchar(500))的范围从20个字符到400个字符。如果我在没有INTO
子句的情况下运行该查询,我将看到较长的Employee.Resume值几乎位于10000行的末尾
当将结果转入临时表时,IN子句是否考虑整个结果集?还是使用前X行来确定大小?或者它只是从原始表“继承”列大小
我几乎可以肯定它复制了原始列的大小,因为我查询了tempdb.sys.columns
,但我只是想检查一下
谢谢。它复制原始列的数据类型。它不尝试对数据长度或精度进行任何平均。但是,与
FILESTREAM
(转换为VARBINARY(MAX)
)和IDENTITY
列(有时不保留)相关的一些例外情况
发件人:
新_表的格式是通过计算选择列表中的表达式来确定的。新_表中的列是按照选择列表指定的顺序创建的。新_表中的每一列与选择列表中的相应表达式具有相同的名称、数据类型、可空性和值。除非在备注部分的“使用标识列”中定义的条件下,否则将转移列的标识属性
数据类型
FILESTREAM属性不会传输到新表。FILESTREAM blob被复制并作为varbinary(max)blob存储在新表中。如果没有FILESTREAM属性,varbinary(max)数据类型的限制为2 GB。如果FILESTREAM BLOB超过此值,将引发错误7119并停止该语句
将现有标识列选择到新表中时,新列将继承标识属性,除非满足以下条件之一:
- SELECT语句包含一个联接
- 多个SELECT语句通过UNION连接
- 标识列在选择列表中多次列出
- 标识列是表达式的一部分
- 标识列来自远程数据源
如Microsoft网站上关于
进入
条款所述:
新_表的格式是通过计算中的表达式来确定的
选择列表。新_表中的列按顺序创建
由选择列表指定。新_表中的每列都具有相同的
名称、数据类型、可空性和值作为相应的
选择列表中的表达式
在您的特定实例中,数据类型将是底层列的任何数据类型(在本例中为
VARCHAR(500)
)。如果要在列中附加另一个字符串,例如'RESUME:'+E.RESUME
,则SQL Server可能会根据其表达式数据类型的常规规则更改数据类型。您也可以在Microsoft网站上找到这些规则。数据类型的确定与into
子句无关。我认为SQL Server在这种情况下只会使用输入列的大小来表示类型,而文档是错误的,因为列的大小不是通过计算表达式来确定的。