2011-02-10 63 views
0

如果我有一个返回临时表的函数,如何在SQL Server中设置一个var来保存它?从函数SQL Server中选择@var =时态表结果?

如果函数的结果是一样的东西:

temp table 
    item1 item2...itemn 
     1  2... n 

这是有效的?

SELECT @table = * FROM dbo.SOME_FUNCTION() 

?? ??

如果这是可能的,你可以举一个例子,了解如何使用@table var来知道值吗?

如果不行,我该如何访问函数返回的临时表?

回答

2

如果函数返回一个表,你应该能够有:

INSERT INTO @table (Col1, Col2) SELECT * FROM dbo.SOME_FUNCTION() 

你需要指定你要使用的无论是INSERT或SELECT部分​​列声明。

UPDATE:

这里的东西我已经想出这样你就可以找出列。第一部分是启用你的服务器,这样它就可以像普通表一样返回并使用存储过程(与你的DBA或者运行服务器的人一样,他们可以正常启动这些选项)。您将结果集选择到临时表中,然后运行sp_columns存储过程tempdb,然后将其插入到另一个临时表(然后放下)中。这样,你至少知道你有什么列,并且可能使用它来更容易地处理动态列名。

sp_configure 'Show Advanced Options', 1 
GO 

RECONFIGURE 
GO 

sp_configure 'Ad Hoc Distributed Queries', 1 
GO 

RECONFIGURE 
GO 

SELECT * INTO #ItemsTable FROM dbo.SOME_FUNCTION() 

SELECT * INTO #Columns FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;', 'exec tempdb..sp_columns ''#ItemsTable''') 

SELECT COLUMN_NAME FROM #Columns 

DROP TABLE #Columns 

另一个更新:

如果你想获得列的列表在数据库中的表,你可以使用此查询:

SELECT [name] FROM sys.columns WHERE object_id = (SELECT object_id FROM sys.tables WHERE [name] = 'TableName') 

但是!如果你要运行这个查询并且每天创建多个不同大小的表,我建议你坚持使用临时表。这样你就不会不必要地写入数据库(tempdb除外)。如果由于某种原因你需要每次创建永久表,那么,我想这也没关系!

+0

如何@table看起来像指令后? – cMinor 2011-02-10 04:21:22

0

有了SQL Server 2008,你也有INSERT缴费(MSDN Documentation

有了这个,你应该能够做到:

SELECT * 
INTO new_table 
FROM dbo.SOME_FUNCTION() 

的额外的好处,这是,你不会有先声明你的本地表变量。从MSDN文档参考来关于* NEW_TABLE *此摘录:

指定的新表的名称 创建的基础上, 选择列表中的列和数据源选择 行。

1

使用你的例子:

Declare @table TABLE 
(
Item1 int, 
Item2 int, 
Item3 int 
) 

INSERT INTO @table (Item1, Item2, Item3) SELECT * FROM dbo.SOME_FUNCTION()