SQL Server: использование таблицы или @table в хранимой процедуре - PullRequest
1 голос
/ 06 сентября 2010

У меня есть хранимая процедура (см. Ниже), которая вставляет данные в физическую таблицу, а затем объединяет информацию с sys.databases. Я думал, что было бы лучше не иметь физической таблицы для вставки данных? Было бы лучше получить эти результаты в табличную переменную в рамках этой процедуры? Если да, то как это сделать?

CREATE PROCEDURE dbo.PROC_getDbInfo
AS
    SET NOCOUNT ON
    GO
    TRUNCATE TABLE dbo.dbinfo
    GO
    EXECUTE sp_msforeachdb 'insert into dbo.dbinfo 
            select  ''?'' as name,
                    type_desc, 
                    physical_name, 
                    state_desc, 
                    size * 1.0/128 as size_in_mb, 
                    max_size, 
                    growth * 1.0/128 as growth_in_mb, 
                    is_percent_growth,
                    is_read_only    
    from [?].sys.database_files'

    GO

    SELECT  @@SERVERNAME as instance_name,
        f.name,
        d.create_date,
        d.compatibility_level,
        d.collation_name,
        d.user_access_desc,
        d.state_desc,
        d.recovery_model_desc,
        d.page_verify_option_desc,
        d.log_reuse_wait_desc,
        f.type_desc, 
        f.physical_name, 
        f.state_desc, 
        f.size_in_mb, 
        f.max_size, 
        f.growth_in_mb, 
        f.is_percent_growth,
        f.is_read_only  
    FROM dbo.dbinfo AS f INNER JOIN
            sys.databases AS d
                ON f.name = d.name
    ORDER BY f.name
GO

Ответы [ 3 ]

1 голос
/ 06 сентября 2010

Вам придется использовать стол.Либо глобальная временная температура (##), либо обычная таблица.

Переменная таблицы не будет находиться в области действия для вызова sp_msforeachdb, если она объявлена ​​для хранимого процесса, и не будет видима для хранимого процесса, если она объявлена ​​в sp_msforeachdb

0 голосов
/ 06 сентября 2010

Использование табличных переменных объясняется здесь:

http://msdn.microsoft.com/en-us/library/ms175010.aspx

Он в основном ведет себя как таблица, когда дело доходит до того, как выглядит ваш сценарий, но имеет совершенно другое поведение под капотом, и, если он достаточно мал, не должен приводить к какой-либо дисковой IO.

Кроме того, если таблица только используется, а затем удаляется в ходе процедуры, это ограничение области действия становится аргументом для ее использования.

0 голосов
/ 06 сентября 2010

@ table лучше - таблица маленькая, и затраты на ввод-вывод замедляют ее.

...