Как определить внутреннее имя табличной переменной в MS SQL Server 2005 - PullRequest
4 голосов
/ 18 сентября 2008

Имя временной таблицы, например # 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 ]

6 голосов
/ 19 декабря 2011

Метаданные табличных переменных также доступны для просмотра в 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'  
0 голосов
/ 19 сентября 2008

Из Книг Онлайн:

Переменная таблицы ведет себя как локальная переменная. Он имеет четко определенную область видимости, то есть функцию, хранимую процедуру или пакет, в котором он объявлен.

Учитывая это, не нужно искать это значение во время выполнения, потому что вы должны знать это во время разработки.

0 голосов
/ 19 октября 2008

Что касается передачи произвольных списков / массивов в функцию SQL Server 2005 или 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

0 голосов
/ 18 сентября 2008

Я не верю, что вы можете, так как переменные таблицы создаются в памяти, а не в базе данных tempdb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...