Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Использовать систему отчетности, например, MS Sql Reporting Service. Создать матричный отчет, а в качестве запроса у нас будет «простой» Select. Почему мы так не сделали? В проекте не так много было отчетов, чтобы внедрять туда SSRS.
Для обоих подходов планы запросов кэшируются, но они отличаются.
USE AdventureWorks2012
GO
DBCC FREEPROCCACHE
DECLARE
@str VARCHAR(MAX) = 'SELECT * FROM Person.Person WHERE FirstName = '
, @param VARCHAR(50) = 'David'
EXEC (@str + '''' + @param + '''')
SET @param = 'Tom'
EXEC (@str + '''' + @param + '''')
SELECT st.[text], cp.plan_handle
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
WHERE st.[text] LIKE '%SELECT * FROM Person.Person%'
AND st.[text] NOT LIKE '%select st.text%'
GO
DBCC FREEPROCCACHE
EXEC sys.sp_executesql
N'SELECT * FROM Person.Person WHERE FirstName = @val',
N'@val VARCHAR(200)',
'David'
EXEC sys.sp_executesql
N'SELECT * FROM Person.Person WHERE FirstName = @val',
N'@val VARCHAR(200)',
'Tom'
SELECT st.[text], cp.plan_handle
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
WHERE st.[text] LIKE '%SELECT * FROM Person.Person%'
AND st.[text] NOT LIKE '%select st.text%'
text plan_handle
------------------------------------------------------------ ----------------------------------------------
SELECT * FROM Person.Person WHERE FirstName = 'Tom' 0x06000B00CA31691380824B12020000000100000000
SELECT * FROM Person.Person WHERE FirstName = 'David' 0x06000B007BF4203740804B12020000000100000000
text plan_handle
--------------------------------------------------------------------------- ----------------------------------------
(@val VARCHAR(200))SELECT * FROM Person.Person WHERE FirstName = @val 0x06000B00632CDD0440804B12020000000100
DBCC FREEPROCCACHE
SET STATISTICS IO ON
SELECT * FROM Person.[Address] WHERE City = 'Bothell'
SELECT * FROM Person.[Address] WHERE City = 'Seattle'
(26 row(s) affected)
Table 'Address'. Scan count 1, logical reads 268, ...
(141 row(s) affected)
Table 'Address'. Scan count 1, logical reads 346, ...
DBCC FREEPROCCACHE
SET STATISTICS IO ON
EXEC sys.sp_executesql
N'SELECT * FROM Person.[Address] WHERE City = @val',
N'@val VARCHAR(200)',
'Bothell'
EXEC sys.sp_executesql
N'SELECT * FROM Person.[Address] WHERE City = @val',
N'@val VARCHAR(200)',
'Seattle'
(26 row(s) affected)
Table 'Address'. Scan count 1, logical reads 268, ...
(141 row(s) affected)
Table 'Address'. Scan count 1, logical reads 498, ... логических чтений больше
Dynamic T-SQL и как он может быть полезен