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

ただし、オブジェクト名は自動生成され、変数名とは関係がないことに気付くでしょう。

上記のようにフィルタリングに使用できる保証された一意の列名がなく、テーブル変数に少なくとも1つの行が含まれている場合は、(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

Books Onlineから:

テーブル変数はローカル変数のように動作します。スコープは明確に定義されています。スコープは、宣言された関数、ストアドプロシージャ、またはバッチです。

これを考えると、設計時に知る必要があるため、実行時にこの値を調べる必要はありません。

于 2008-09-18T20:05:17.313 に答える
-2

テーブル変数はtempdbではなくメモリに作成されるため、できるとは思いません。

于 2008-09-18T19:13:37.923 に答える
-3

任意のリスト/配列をSQLServer2005関数またはsprocに渡すというトピックに関して、
私が知っている最も厄介な方法は、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)

結果は行セットになります

BondId

8681

8680

8684

他のいくつかの例は、http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID = 678284&SiteID= 1にあります。

于 2008-10-19T01:23:56.590 に答える