在函数中是否可能有临时表?

23

显然我不能使用它们。我收到了如下错误信息:

函数内无法使用具有副作用的运算符 'SELECT'

如果我想做这样的事情:

select bleh
  into #temp
  from Blah

...在函数内部。


3
你可以使用一个表变量代替。 - Joe Stefanelli
2个回答

40

不行,根据这个类似问题的讨论串,你不能这样做,但是你可以使用一个表变量

DECLARE @MyTempTableVariable TABLE (SCHEMA)

INSERT INTO @MyTempTableVariable
SELECT bleh
FROM bleh

基数错误是我们想要在 SQL 数据库函数中用临时表替换表变量的最大原因。然而,这个问题有一个解决方法,在这里详细描述:http://blogs.msdn.com/b/blogdoezequiel/archive/2012/12/01/table-variables-and-row-estimations.aspx#.VGC5oMnm7HS 在使用表变量的语句中添加 OPTION (RECOMPILE) 可能会提高性能。 - Vladislav
这对我不起作用...这可能是因为我在我的表变量中添加了一个 INT IDENTITY(1,1) 列吗? - Isaac Reefman
为什么对于表变量要有一个身份标识?这些应该很短暂,可能不需要 IDENTITY - 但这是我的个人看法。 - Justin Pihony

2

您也可以使用公共表表达式(CTE)来完成此操作。在SSMS中查看模板浏览器。IntelliSense会干扰操作并且在完成CTE以及接下来的插入/选择之前会显示错误,但是它仍然可以正常工作。


这应该是一个评论,而不是一篇回答。 - Mohammad Akbari
@MohammadAkbari:我不同意。它为其他答案提供了一个非常有效的替代方案。 - davidhigh
5
@Lew Wolf:一个示例或一些代码会很好,不过。 - davidhigh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接