2010-09-06 24 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。另外,如果仅在过程过程中使用并删除表,则此范围限制成为使用它的参数。