SQL Server:在存储过程中使用表或@table

时间:2010-09-06 12:12:55

标签: sql sql-server sql-server-2008 stored-procedures

我有一个存储过程(见下文),它将数据插入物理表,然后将信息与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 个答案:

答案 0 :(得分:1)

你必须使用一张桌子。全局临时(##)或普通表。

如果为存储过程声明,则表变量不在sp_msforeachdb调用的范围内,如果在sp_msforeachdb

中声明,则不对存储过程可见

答案 1 :(得分:0)

@table更好 - 表格很小,而且i / o成本会降低它的速度。

答案 2 :(得分:0)

表变量用法在这里解释:

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

当涉及到脚本的外观时,它基本上就像一个表 - 但在引擎盖下有不同的行为,如果它足够小不应该导致任何光盘IO。

此外,如果仅在程序过程中使用并删除该表,则此范围限制将成为使用该表的参数。