ejemplos tsql

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