Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 1035408

Browse files
committed
BrentOzarULTD#1318 - Make sp_foreachdb AG-aware
Also sneak in fix for 1156 to maintain backwards compatibility of command params
1 parent 7dc65dc commit 1035408

File tree

1 file changed

+34
-14
lines changed

1 file changed

+34
-14
lines changed

‎sp_foreachdb.sql

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ GO
77

88
ALTER PROCEDURE dbo.sp_foreachdb
99
-- Original fields from sp_MSforeachdb...
10-
@command1 NVARCHAR(MAX) ,
10+
@command1 NVARCHAR(MAX) =NULL,
1111
@replacechar NCHAR(1) = N'?' ,
1212
@command2 NVARCHAR(MAX) = NULL ,
1313
@command3 NVARCHAR(MAX) = NULL ,
1414
@precommand NVARCHAR(MAX) = NULL ,
1515
@postcommand NVARCHAR(MAX) = NULL ,
1616
-- Additional fields for our sp_foreachdb!
17+
@command NVARCHAR(MAX) = NULL, --For backwards compatibility
1718
@print_dbname BIT = 0 ,
1819
@print_command_only BIT = 0 ,
1920
@suppress_quotename BIT = 0 ,
@@ -37,6 +38,14 @@ AS
3738
SET @Version = '2.0';
3839
SET @VersionDate = '20171201';
3940

41+
IF ( (@command1 IS NOT NULL AND @command IS NOT NULL)
42+
OR (@command1 IS NULL AND @command IS NULL) )
43+
BEGIN
44+
RAISERROR('You must supply either @command1 or @command, but not both.',16,1);
45+
RETURN -1;
46+
END;
47+
48+
SET @command1 = COALESCE(@command1,@command);
4049

4150
DECLARE @sql NVARCHAR(MAX) ,
4251
@dblist NVARCHAR(MAX) ,
@@ -104,55 +113,66 @@ AS
104113

105114
CREATE TABLE #x ( db NVARCHAR(300) );
106115

107-
SET @sql = N'SELECT name FROM sys.databases WHERE 1=1'
108-
+ CASE WHEN @system_only = 1 THEN ' AND database_id IN (1,2,3,4)'
116+
SET @sql = N'SELECT name FROM sys.databases d WHERE 1=1'
117+
+ CASE WHEN @system_only = 1 THEN ' AND d.database_id IN (1,2,3,4)'
109118
ELSE ''
110119
END
111120
+ CASE WHEN @user_only = 1
112-
THEN ' AND database_id NOT IN (1,2,3,4)'
121+
THEN ' AND d.database_id NOT IN (1,2,3,4)'
113122
ELSE ''
114123
END
115124
-- To exclude databases from changes
116125
+ CASE WHEN @exlist IS NOT NULL
117-
THEN ' AND name NOT IN (' + @exlist + ')'
126+
THEN ' AND d.name NOT IN (' + @exlist + ')'
118127
ELSE ''
119128
END + CASE WHEN @name_pattern <> N'%'
120-
THEN ' AND name LIKE N''' + REPLACE(@name_pattern,
129+
THEN ' AND d.name LIKE N''' + REPLACE(@name_pattern,
121130
'''', '''''')
122131
+ ''''
123132
ELSE ''
124133
END + CASE WHEN @dblist IS NOT NULL
125-
THEN ' AND name IN (' + @dblist + ')'
134+
THEN ' AND d.name IN (' + @dblist + ')'
126135
ELSE ''
127136
END
128137
+ CASE WHEN @recovery_model_desc IS NOT NULL
129-
THEN ' AND recovery_model_desc = N'''
138+
THEN ' AND d.recovery_model_desc = N'''
130139
+ @recovery_model_desc + ''''
131140
ELSE ''
132141
END
133142
+ CASE WHEN @compatibility_level IS NOT NULL
134-
THEN ' AND compatibility_level = '
143+
THEN ' AND d.compatibility_level = '
135144
+ RTRIM(@compatibility_level)
136145
ELSE ''
137146
END
138147
+ CASE WHEN @state_desc IS NOT NULL
139-
THEN ' AND state_desc = N''' + @state_desc + ''''
148+
THEN ' AND d.state_desc = N''' + @state_desc + ''''
140149
ELSE ''
141150
END
151+
+ CASE WHEN @state_desc = 'ONLINE' AND SERVERPROPERTY('IsHadrEnabled') = 1
152+
THEN ' AND NOT EXISTS (SELECT 1
153+
FROM sys.dm_hadr_database_replica_states drs
154+
JOIN sys.availability_replicas ar
155+
ON ar.replica_id = drs.replica_id
156+
JOIN sys.dm_hadr_availability_group_states ags
157+
ON ags.group_id = ar.group_id
158+
WHERE drs.database_id = d.database_id
159+
AND ar.secondary_role_allow_connections = 0
160+
AND ags.primary_replica <> @@SERVERNAME)'
161+
END
142162
+ CASE WHEN @is_read_only IS NOT NULL
143-
THEN ' AND is_read_only = ' + RTRIM(@is_read_only)
163+
THEN ' AND d.is_read_only = ' + RTRIM(@is_read_only)
144164
ELSE ''
145165
END
146166
+ CASE WHEN @is_auto_close_on IS NOT NULL
147-
THEN ' AND is_auto_close_on = ' + RTRIM(@is_auto_close_on)
167+
THEN ' AND d.is_auto_close_on = ' + RTRIM(@is_auto_close_on)
148168
ELSE ''
149169
END
150170
+ CASE WHEN @is_auto_shrink_on IS NOT NULL
151-
THEN ' AND is_auto_shrink_on = ' + RTRIM(@is_auto_shrink_on)
171+
THEN ' AND d.is_auto_shrink_on = ' + RTRIM(@is_auto_shrink_on)
152172
ELSE ''
153173
END
154174
+ CASE WHEN @is_broker_enabled IS NOT NULL
155-
THEN ' AND is_broker_enabled = ' + RTRIM(@is_broker_enabled)
175+
THEN ' AND d.is_broker_enabled = ' + RTRIM(@is_broker_enabled)
156176
ELSE ''
157177
END;
158178

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /