我有一个存储过程(见下文),它将数据插入物理表,然后将信息与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
答案 0 :(得分:1)
你必须使用一张桌子。全局临时(##)或普通表。
如果为存储过程声明,则表变量不在sp_msforeachdb
调用的范围内,如果在sp_msforeachdb
答案 1 :(得分:0)
@table更好 - 表格很小,而且i / o成本会降低它的速度。
答案 2 :(得分:0)
表变量用法在这里解释:
http://msdn.microsoft.com/en-us/library/ms175010.aspx
当涉及到脚本的外观时,它基本上就像一个表 - 但在引擎盖下有不同的行为,如果它足够小不应该导致任何光盘IO。
此外,如果仅在程序过程中使用并删除该表,则此范围限制将成为使用该表的参数。