Friday, December 13, 2024

sp_MSforeachdb and sp_msforeachTable

 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