可以使用
确定临时表的名称,例如#t1
1 2 3
| select @TableName = [Name]
from tempdb.sys.tables
where [Object_ID] = object_id('tempDB.dbo.#t1') |
如何找到表值变量的名称,即由
声明的变量
1
| declare @t2 as table (a int) |
目的是能够使用
之类的东西获取有关表的元信息。
1 2 3 4 5
| select @Headers = dbo.Concatenate('[' + c.[Name] + ']')
from sys.all_columns c
inner join sys.tables t
on c.object_id = t.object_id
where t.name = @TableName |
尽管对于临时表,您必须查找tempdb.sys.tables而不是sys.tables。您在哪里寻找表值变量?
我现在意识到我无法做我想做的事,这是编写一个通用函数来将表值变量格式化为html表。首先,在sql server 2005中,您不能传递表值参数:
http://www.sqlteam.com/article/sql-server-2008-table-valued-parameters
此外,在sql server 2008中,必须对参数进行强类型化,因此您将始终知道列的数量和类型。
n
来自在线图书:
表变量的行为类似于局部变量。它具有定义明确的范围,即它在其中声明的函数,存储过程或批处理。
鉴于此,应该不必在运行时查找此值,因为您必须在设计时知道它。
我不相信您可以,因为表变量是在内存中而不是在tempdb中创建的。
关于将任意列表/数组传递到SQL Server 2005函数或sproc的主题,
我所知道的最简单的方法是使用XML变量。如果需要,该XML变量可以是与XML模式相关联的强类型XML类型。
给定一个以XML形式传递到过程/函数的列表,您可以通过"切碎"将该列表提取到表变量或临时表中。
"切碎" XML意味着朝相反的方向转换-从XML到行集。 (FOR XML子句导致将行集转换为XML。)
在用户定义的表函数中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| CREATE FUNCTION [dbo].[udtShredXmlInputBondIdList]
(
-- Add the parameters for the function here
@xmlInputBondIdList xml
)
RETURNS
@tblResults TABLE
(
-- Add the column definitions for the TABLE variable here
BondId int
)
AS
BEGIN
-- Should add a schema validation for @xmlInputIssuerIdList here
--Place validation here
-- Fill the table variable with the rows for your result set
INSERT @tblResults
SELECT
nref.value('.', 'int') as BondId
FROM
@xmlInputBondIdList.nodes('//BondID') as R(nref)
RETURN
END |
如果@xmlInputBondIdList是预期结构的XML片段(如以下所示),则按以下方式调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| DECLARE @xmlInputBondIdList xml
SET @xmlInputBondIdList =
'<XmlInputBondIdList>
<BondID>8681</BondID>
<BondID>8680</BondID>
<BondID>8684</BondID>
</XmlInputBondIdList>
'
SELECT *
FROM [CorporateBond].[dbo].[udtShredXmlInputBondIdList]
(@xmlInputBondIdList) |
结果将是行集
BondId
8681
8680
8684
可以在http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=678284中找到其他几个示例。