我在这样的存储过程中声明了一个表:
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')
(带有@),但它会抛出相同的错误。
如何获取此临时表的列名?
答案 0 :(得分:2)
问题在于这一行:
where o.name = object_id('tempdb..#tableName')
您正在将名称与对象ID进行比较。我不确定你在这里真正想做什么,因为你在列中有一个硬编码的名字。表名与临时表无关,因此这种方法不起作用。
由于表变量的处理方式与临时表不同,因此系统表可能无法执行您想要的操作。 Here是使用XML检索名称的答案。
答案 1 :(得分:0)
那是table variable。它只适用于程序的生命。没有理由在系统表中记录列。
ID bigint
似乎没了。表变量不应该包含很多行。
您可能正在寻找temporary table。它以#。
开头表示