5

可以使用 #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 中,您不能传递表值参数:

http://www.sqlteam.com/article/sql-server-2008-table-valued-parameters

此外,在 sql server 2008 中,参数必须是强类型的,因此您将始终知道列的数量和类型。

4

4 回答 4

6

表变量元数据也可以在其中查看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'  
于 2011-12-19T13:01:13.900 回答
1

来自在线书籍:

表变量的行为类似于局部变量。它有一个明确定义的范围,即声明它的函数、存储过程或批处理。

鉴于此,不需要在运行时查找该值,因为您必须在设计时知道它。

于 2008-09-18T20:05:17.313 回答
-2

我不相信你可以,因为表变量是在内存中而不是在 tempdb 中创建的。

于 2008-09-18T19:13:37.923 回答
-3

关于将任意列表/数组传递到 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

其他几个示例可以在http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=678284&SiteID=1找到

于 2008-10-19T01:23:56.590 回答