如果我有一个返回时态表的函数,如何在SQL Server中设置保存它的var?
如果函数的结果如下:
temp table
item1 item2...itemn
1 2... n
这有效吗?
SELECT @table = * FROM dbo.SOME_FUNCTION()
...
如果可以,您能举例说明如何使用@table
var来了解值吗?
如果不可能,我如何访问该函数返回的临时表?
答案 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 *:
的摘录指定要新表的名称 根据中的列创建 选择列表和选择的行 来自数据源。