2010-09-06 61 views
1

我有一個存儲過程(見下文),它將數據插入物理表中,然後將信息與sys.databases連接起來。我在想,沒有用於數據插入的物理表格會更好嗎?在這個過程中將這些結果提取到表變量中會更好嗎?如果是這樣,該怎麼做?SQL Server:在存儲過程中使用表或@table

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 

回答

1

您必須使用表格。全局臨時(##)或普通表。

表變量不會在作用域

0

@table更好 - 表格很小,I/O成本會降低它。

+0

將不會在範圍但如果聲明的存儲過程,並存儲的過程不可見,如果在sp_msforeachdb宣佈sp_msforeachdb通話 – gbn 2010-09-06 12:33:25

0

表變量的使用在此說明:

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

基本上,它就像一個表,當涉及到你的腳本的樣子 - 但引擎蓋下非常不同的行爲,如果它足夠小應不會導致任何磁盤IO。另外,如果僅在過程過程中使用並刪除表,則此範圍限制成爲使用它的參數。