从函数SQL Server中选择@var = temporal表结果?

时间:2011-02-10 03:58:31

标签: sql-server sql-server-2008

如果我有一个返回时态表的函数,如何在SQL Server中设置保存它的var?

如果函数的结果如下:

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

这有效吗?

SELECT @table = * FROM dbo.SOME_FUNCTION()

...

如果可以,您能举例说明如何使用@table var来了解值吗?

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

3 个答案:

答案 0 :(得分:2)

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

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

您需要指定要用于语句的INSERT或SELECT部分​​的列。

更新:

这是我提出的一些内容,因此您可以找到列。第一部分是启用您的服务器,以便它可以像普通表一样返回并使用存储过程(请与您的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除外)。如果由于某种原因你每次都需要创建永久表,那么,我想这也很好!

答案 1 :(得分:1)

使用您的示例:

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

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

答案 2 :(得分:0)

使用SQL Server 2008,您还可以使用INSERT(MSDN Documentation

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

SELECT * 
INTO new_table 
FROM dbo.SOME_FUNCTION()

这样做的另一个好处是您不必先声明本地表变量。从MSDN文档参考中可以看到关于* new_table *:

的摘录
  

指定要新表的名称   根据中的列创建   选择列表和选择的行   来自数据源。