Tsql 如何在MS SQL Server 2005中确定表值变量的内部名称

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

临时表(如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  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这是一个神话。