2008-09-18 6 views
4

Le nom d'une table temporaire telle que # t1 peut être déterminée en utilisantComment déterminer le nom interne de la variable d'une valeur de table dans MS SQL Server 2005

select @TableName = [Name] 
from tempdb.sys.tables 
where [Object_ID] = object_id('tempDB.dbo.#t1') 

Comment puis-je trouver le nom d'une table des variables d'une valeur , soit déclarée par

declare @t2 as table (a int) 

le but est d'être en mesure d'obtenir méta-informations sur la table, en utilisant quelque chose comme

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 

bien que pour les tables temporaires, vous devez regarder tempdb.sys.tables au lieu de sys.tables. Où recherchez-vous les variables de valeur table?


Je me rends compte maintenant que je ne peux pas faire ce que je voulais faire, ce qui est d'écrire une fonction générique pour la table de mise en forme des variables évaluées dans les tables html. Pour commencer, dans le serveur SQL 2005, vous ne pouvez pas passer la table des paramètres évalués:

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

Par ailleurs, dans le serveur SQL 2008, les paramètres doivent être fortement typé, de sorte que vous saurez toujours le nombre et le type de colonnes.

Répondre

-1

Je ne crois pas que vous le pouvez, car les variables de table sont créées en mémoire et non dans tempdb.

+3

-1 Ceci est un mythe. [Ma réponse montre que c'est possible] (http://stackoverflow.com/a/8561729/73226) –

0

De Livres en ligne:

Une variable de table se comporte comme une variable locale. Il a une portée bien définie, qui est la fonction, la procédure stockée ou le lot dans lequel elle est déclarée. Par conséquent, il ne devrait pas être nécessaire de rechercher cette valeur au moment de l'exécution, car vous devez le connaître au moment de la conception.

+0

une raison de le rechercher au moment de l'exécution est de comprendre combien de colonnes il a et quels sont ses types. – user18116

-2

Sur le thème de la transmission de listes/tableaux arbitraires dans une fonction SQL Server 2005 ou un sproc,
, le moyen le moins honteux que je connaisse est d'utiliser une variable XML. Si vous le souhaitez, cette variable XML peut être un type XML fortement typé associé à un schéma XML. Étant donné une liste passée dans une procédure/fonction en tant que XML, vous pouvez extraire cette liste dans une variable de table ou une table temporaire via "déchiquetage". "To shred" XML signifie transformer dans le sens opposé - du XML au (x) rowset (s). (La clause FOR XML provoque la transformation d'un ensemble de lignes en XML.)

Dans la fonction de table définie par l'utilisateur

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 

si le @xmlInputBondIdList est un fragment XML de la structure attendue comme qu'immédiatement ci-dessous et est invoquée comme suit

DECLARE @xmlInputBondIdList xml 
SET @xmlInputBondIdList = 
'<XmlInputBondIdList> 

<BondID>8681</BondID> 

<BondID>8680</BondID> 

<BondID>8684</BondID> 

</XmlInputBondIdList> 
' 

SELECT * 
FROM [CorporateBond].[dbo].[udtShredXmlInputBondIdList] 
    (@xmlInputBondIdList) 

le résultat sera être le jeu de lignes

BondId

Un couple d'autres exemples peuvent être trouvés à http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=678284&SiteID=1

5

Tableau métadonnées variable est visible dans tempdb.sys.tables aussi. Ceci est facilement vérifiable du dessous

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' 

Exemple Résultats

name       object_id 
------------------------------ ----------- 
#4DB4832C      1303675692 

Mais vous remarquerez le nom d'objet est généré automatiquement et n'a aucun rapport avec le nom de la variable. Si vous ne disposez pas d'un nom de colonne unique garanti que vous pouvez utiliser pour filtrer comme ci-dessus et que la variable table contient au moins une ligne, vous pouvez (à partir de SQL Server 2008) utiliser %%physloc%% et DBCC PAGE pour le déterminer information. Exemple ci-dessous

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' 
Questions connexes