我在存储过程中声明了一个表,如下所示:
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
似乎不对劲。 表变量不应包含大量行。
您可能正在寻找临时表。 它以 # 开头表示。
比较表变量与临时表