【发布时间】:2011-02-02 06:10:48
【问题描述】:
这句话有些奇怪 COALESCE(@param_ids + ',', '')
@param_ids 作为参数传入,它是@param_ids VARCHAR(MAX)
知道为什么 SQL-Server 无法为以下场景生成缓存计划。 此问题已上报给 Microsoft,他们仍在处理中。
不工作场景 - 没有生成缓存计划 第 1 步
改变一个 SP
IF (LTRIM(RTRIM(ISNULL(@param_ids,''))) = '')
BEGIN
SELECT @param_ids = COALESCE(@param_ids + ',', '') + CONVERT(VARCHAR(50),ID)
FROM [dbo].Content_Type WITH (NOLOCK)
END
第 2 步 带参数的 Exec Sp
第 3 步(无缓存计划)
SELECT *
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
WHERE [dbid] = DB_ID('databasename')
AND [objectid] = OBJECT_ID('databasename.dbo.us_spname')
GO
工作场景——生成缓存计划 第 1 步
改变一个 SP
IF (LTRIM(RTRIM(ISNULL(@param_ids,''))) = '')
BEGIN
--SELECT @param_ids = COALESCE(@param_ids + ',', '') + CONVERT(VARCHAR(50),ID)
--FROM [dbo].Content_Type WITH (NOLOCK)
SELECT @param_ids = COALESCE('aaaaaaa' + ',', '') + CONVERT(VARCHAR(50),ID)
FROM [dbo].Content_Type WITH (NOLOCK)
END
第 2 步 带参数的 Exec Sp
第 3 步(缓存计划退出)
SELECT *
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
WHERE [dbid] = DB_ID('databasename')
AND [objectid] = OBJECT_ID('databasename.dbo.us_spname')
GO
谢谢
【问题讨论】:
-
当我在本地尝试时,我得到不同的 dbID 和 DB_ID('databasename')。请在您的选择语句中包含 DB_ID('databasename'),OBJECT_ID('databasename.dbo.us_spname') 我认为这两种情况可能不同
-
你能发布完整的存储过程吗?我可以重现这一点,但如果整个过程都在 if 子句中,那么如果你传入值,它似乎不需要计划(除了返回给定的@param_ids)。
标签: database sql-server-2005 coalesce sqlcachedependency