从临时@table获取列



我在存储过程中声明了一个表,如下所示:

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 值"活动资源"转换为数据类型 int 时转换失败。

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

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

问题是这一行:

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

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

由于表变量的处理方式与临时表不同,因此系统表可能无法执行所需的操作。 下面是有关使用 XML 检索名称的答案。

这是一个表变量。 它只在程序的生命周期内存在。 没有理由在系统表中记录列。

ID bigint似乎不对劲。 表变量不应包含大量行。

您可能正在寻找临时表。 它以 # 开头表示。

比较表变量与临时表

最新更新