tsql - ejemplos - select max sql server
Cómo determinar el nombre interno de la variable con valores de tabla en MS SQL Server 2005 (4)
El nombre de una tabla temporal como # t1 puede determinarse usando
select @TableName = [Name]
from tempdb.sys.tables
where [Object_ID] = object_id(''tempDB.dbo.#t1'')
¿Cómo puedo encontrar el nombre de una variable valorada de tabla, es decir, una declarada por
declare @t2 as table (a int)
el objetivo es poder obtener metainformación sobre la tabla, usando algo como
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
aunque para las tablas temporales debe buscar en tempdb.sys.tables
en lugar de sys.tables
. ¿dónde buscas las variables valoradas en la tabla?
Ahora me doy cuenta de que no puedo hacer lo que quería hacer, que es escribir una función genérica para formatear las variables valoradas de la tabla en tablas html. Para empezar, en sql server 2005 no puede pasar los parámetros de la tabla valorada:
http://www.sqlteam.com/article/sql-server-2008-table-valued-parameters
además, en el servidor sql 2008, los parámetros deben estar fuertemente tipados, por lo que siempre sabrá el número y tipo de columnas.
De libros en línea:
Una variable de tabla se comporta como una variable local. Tiene un alcance bien definido, que es la función, el procedimiento almacenado o el lote en el que se declara.
Dado esto, no debería haber necesidad de buscar este valor en tiempo de ejecución porque debe conocerlo en tiempo de diseño.
No creo que puedas, ya que las variables de tabla se crean en la memoria no en tempdb.
Los metadatos de variables de tabla también se pueden ver en tempdb.sys.tables
. Esto es fácilmente verificable desde abajo
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''
Resultados de ejemplo
name object_id
------------------------------ -----------
#4DB4832C 1303675692
Pero notará que el nombre del objeto se genera automáticamente y no tiene relación con el nombre de la variable.
Si no tiene un nombre de columna exclusivo garantizado que puede usar para filtrar como se %%physloc%%
arriba y la variable de tabla tiene al menos una fila, puede (a partir de SQL Server 2008 en adelante) usar %%physloc%%
y DBCC PAGE
para determinar esta informacion. Ejemplo a continuación.
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''
Sobre el tema de pasar listas / matrices arbitrarias a una función o sproc de SQL Server 2005,
Lo menos que sé es utilizar una variable XML. Si lo desea, esa variable XML puede ser un tipo XML fuertemente tipado que se asocia con un Esquema XML.
Dada una lista pasada a un procedimiento / función como XML, puede extraer esa lista en una tabla variable o tabla temporal a través de "trituración". "Triturar" XML significa transformarse en la dirección opuesta: de XML a conjuntos de filas. (La cláusula FOR XML causa un conjunto de filas a la transformación XML).
En la función de tabla definida por el usuario
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 el @xmlInputBondIdList es un fragmento XML de la estructura esperada similar a la inmediatamente inferior y se invoca de la siguiente manera
DECLARE @xmlInputBondIdList xml
SET @xmlInputBondIdList =
''<XmlInputBondIdList>
<BondID>8681</BondID>
<BondID>8680</BondID>
<BondID>8684</BondID>
</XmlInputBondIdList>
''
SELECT *
FROM [CorporateBond].[dbo].[udtShredXmlInputBondIdList]
(@xmlInputBondIdList)
el resultado será el conjunto de filas
BondId
8681
8680
8684
Se pueden encontrar otros dos ejemplos en http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=678284&SiteID=1