2016-07-06 26 views
1

对于SQL Server中的表值函数,当执行如下所示的操作时,它只会创建临时表@Table,就像变量(在标量值函数中)一样,是正确的吗?如果要执行许多此类陈述,是否会出现任何问题?SQL Server中的表值函数;函数中的表是暂时的?

CREATE FUNCTION some_function 
    (@some_var varchar(20), @someDate date) 
RETURNS @Table Table (id int, name varchar(50), DoB date) 
AS 
BEGIN 
    INSERT INTO @Table 
     SELECT id, Name, CAST(DoB as date) 
     FROM tblEmployees 

    RETURN 
END 
+0

这不是临时表,它只是一个变量。在这个例子中,你甚至不需要它。您可以创建一个内联函数并直接返回结果。这将允许优化器创建一个更好的计划*并*保存将数据复制到变量中,然后再返回它 –

+0

请在DBA.SE上阅读此答案... http://dba.stackexchange.com/questions/16385/什么是差异之间的临时表和表中的变量在SQL服务器 – TheGameiswar

+0

看看这里https://blogs.msdn.microsoft.com/naga/2015/05/10/sql -server-performance-tuning-table-variable-vs-temporary-tables/ –

回答

1

会出现任何问题,如果很多这样的语句将被执行?

不,那是not possible

一个局部变量的范围是在声明它的批次。

表变量的作用域与标量变量的作用域相同。

About table variable和临时表,简要地:

表变量的范围限制到特定的批次,而本地临时表被限制为特定的SPID。

这意味着,即使你是从多个线程运行相同的代码 - 他们不会#表名称冲突,因为每个线程都有自己的spid。不同的用户(不同的连接)不能和表格变量名称(根本不可能)冲突,也不能在临时表格名称上(不可能针对不同的连接)冲突。

只有##(全局临时表)和#在同一连接内的冲突(例如尝试创建具有相同名称的临时表的嵌套过程)是可能的。