EXECUTE sp_MSforeachdb
'IF ''?'' IN (SELECT DISTINCT CurrentDB FROM #TempServerInfo)
BEGIN
USE [?]
SELECT DISTINCT
so.name AS TableName
, i.name AS IndexName
, s.avg_fragmentation_in_percent AS Fragmentation
, ISNULL(sp.rows_sampled, 0) AS RowsSampled
INTO #ObjectNames
FROM sys.dm_db_index_physical_stats ((SELECT database_id FROM sys.databases WHERE name = ''?''), NULL, NULL, NULL, NULL) AS s
JOIN sys.indexes AS i ON s.object_id = i.object_id AND s.index_id = i.index_id
JOIN sys.objects AS so ON s.object_id = so.object_id
JOIN sys.schemas sch ON sch.schema_id = so.schema_id
JOIN sys.stats AS stat ON s.object_id = stat.object_id AND stat.name = i.name
CROSS APPLY sys.dm_db_stats_properties(stat.object_id, stat.stats_id) AS sp
WHERE i.name like N''PK%'' AND alloc_unit_type_desc = ''IN_ROW_DATA'' AND sch.name = ''dbo''
AND s.partition_number = 1
ORDER BY TableName
INSERT INTO #TableStatistics (TableName, RowCounter, ReservedSize, DataSize, IndexSize, UnusedSize)
EXEC sp_msforeachTable @replacechar = ''#'', @Command1="sp_spaceused ''#''", @whereand="and o.name in (select TableName from #ObjectNames)"
UPDATE #TableStatistics
SET #TableStatistics.IndexName = o.IndexName
, #TableStatistics.RowsSampled = o.RowsSampled
, #TableStatistics.Fragmentation = o.Fragmentation
, #TableStatistics.DeltaRows = ABS(#TableStatistics.RowCounter - o.RowsSampled)
, #TableStatistics.DatabaseName = ''?''
FROM #ObjectNames o
WHERE #TableStatistics.TableName = o.TableName
END'
if the table exists when the batch is compiled, SQL Server will flag an error for a missing column, and this happens before your IF condition is evaluated. You need to nest the SELECT in EXEC() to push it to a deeper scope:
EXECUTE sp_msforeachdb 'USE [?]
IF (''?'' LIKE ''Tran%'' and len(''?'') = 8 and DATABASEPROPERTYEX(''?'', ''Status'') = ''ONLINE'')
Begin
DECLARE @var varchar(20) = ''saurabh''
EXEC sp_executesql N''select Value from [?].DBO.intranet Where name = @var'',
N''@var varchar(20)'', @var
End'
No comments:
Post a Comment