从临时@table获取列

时间:2018-03-09 11:50:51

标签: sql sql-server sql-server-2008

我在这样的存储过程中声明了一个表:

declare @tableName table (ID bigint,
                            Column1 bigint,
                            Column2 datetime,
                            createdBy nvarchar(100),
                            dateAdded nvarchar(12),
                            Type nvarchar(10)
                            )

我想检索列名,所以我尝试使用:

select c.name 
from sys.objects o
join sys.columns c
on o.object_id = c.object_id
where o.name = object_id('tempdb..#tableName')
and c.name != 'id' 
ORDER BY CASE c.name 
                    when 'type' then 1
                    when 'createdBy' then 2
                    when 'Column2' then 3
                    when 'dateAdded' then 4
                    when 'Column1' then 5
END

这会返回错误

  

将nvarchar值'ActivitiesResource'转换为数据类型int。

时转换失败

我尝试删除了部分和部分where子句,因为它们导致了问题,但它仍然会返回错误。我也尝试过where o.name = object_id('tempdb..@tableName')(带有@),但它会抛出相同的错误。

如何获取此临时表的列名?

2 个答案:

答案 0 :(得分:2)

问题在于这一行:

where o.name = object_id('tempdb..#tableName')

您正在将名称与对象ID进行比较。我不确定你在这里真正想做什么,因为你在列中有一个硬编码的名字。表名与临时表无关,因此这种方法不起作用。

由于表变量的处理方式与临时表不同,因此系统表可能无法执行您想要的操作。 Here是使用XML检索名称的答案。

答案 1 :(得分:0)

那是table variable。它只适用于程序的生命。没有理由在系统表中记录列。

ID bigint似乎没了。表变量不应该包含很多行。

您可能正在寻找temporary table。它以#。

开头表示

Comparing Table Variables with Temporary Tables