Tsql 如何在MS SQL Server 2005中确定表值变量的内部名称
临时表(如t1)的名称可以使用Tsql 如何在MS SQL Server 2005中确定表值变量的内部名称,tsql,Tsql,临时表(如t1)的名称可以使用 select @TableName = [Name] from tempdb.sys.tables where [Object_ID] = object_id('tempDB.dbo.#t1') 如何找到表值变量的名称,即 declare @t2 as table (a int) 这样做的目的是能够获得关于表的元信息,使用类似 select @Headers = dbo.Concatenate('[' + c.[Name] + ']') from sy
select @TableName = [Name]
from tempdb.sys.tables
where [Object_ID] = object_id('tempDB.dbo.#t1')
如何找到表值变量的名称,即
declare @t2 as table (a int)
这样做的目的是能够获得关于表的元信息,使用类似
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中,不能传递表值参数:
此外,在sql server 2008中,参数必须是强类型的,因此您将始终知道列的数量和类型。我不相信您可以知道,因为表变量是在内存中而不是在tempdb中创建的。来自联机丛书: 表变量的行为类似于局部变量。它有一个定义良好的作用域,即声明它的函数、存储过程或批处理
有鉴于此,不需要在运行时查找此值,因为您必须在设计时知道它。关于将任意列表/数组传递到SQL Server 2005函数或存储过程的主题,我知道的最简单的方法是使用XML变量。如果需要,该XML变量可以是与XML模式关联的强类型XML类型 给定以XML形式传递到过程/函数中的列表,可以通过分解将该列表提取到表变量或临时表中。 分解XML意味着以相反的方向从XML转换为行集。FOR XML子句导致行集到XML的转换 在用户定义的表函数中
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片段,如下面所示,并按如下方式调用
DECLARE @xmlInputBondIdList xml
SET @xmlInputBondIdList =
'<XmlInputBondIdList>
<BondID>8681</BondID>
<BondID>8680</BondID>
<BondID>8684</BondID>
</XmlInputBondIdList>
'
SELECT *
FROM [CorporateBond].[dbo].[udtShredXmlInputBondIdList]
(@xmlInputBondIdList)
结果将是行集
邦迪德
8681
8680
8684
在表中还可以找到其他几个示例。tempdb.sys.tables中也可以查看变量元数据。这很容易从下面进行验证
declare @t2 as table ( [38F055D8-25D9-4AA6-9571-F436FE] int)
SELECT t.name, t.object_id
FROM tempdb.sys.tables t
JOIN tempdb.sys.columns c
ON t.object_id = c.object_id
WHERE c.name = '38F055D8-25D9-4AA6-9571-F436FE'
示例结果
name object_id
------------------------------ -----------
#4DB4832C 1303675692
但是您会注意到对象名是自动生成的,与变量名没有关系
如果您没有一个可用于筛选的保证唯一列名(如上所述),并且表变量中至少有一行,则从SQL Server 2008开始,您可以使用%%physloc%%和DBCC PAGE来确定此信息。下面的例子
DECLARE @t2 AS TABLE ( a INT)
INSERT INTO @t2
VALUES (1)
DECLARE @DynSQL NVARCHAR(100)
SELECT TOP (1) @DynSQL = 'DBCC PAGE(2,' + CAST(file_id AS VARCHAR) + ',' +
CAST( page_id AS VARCHAR) +
',1) WITH TABLERESULTS'
FROM @t2
CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )
DECLARE @DBCCPage TABLE (
[ParentObject] [VARCHAR](100) NULL,
[Object] [VARCHAR](100) NULL,
[Field] [VARCHAR](100) NULL,
[VALUE] [VARCHAR](100) NULL )
INSERT INTO @DBCCPage
EXEC (@DynSQL)
SELECT VALUE AS object_id,
OBJECT_NAME(VALUE, 2) AS object_name
FROM @DBCCPage
WHERE Field = 'Metadata: ObjectId'
在运行时查找它的一个原因是要找出它有多少列以及它们的类型。-1这是一个神话。