Sql server 需要在所有非系统数据库上运行存储过程
我正在尝试遍历所有非系统数据库并运行一个存储过程。此存储过程存在于所有用户数据库中 到目前为止,我发现:Sql server 需要在所有非系统数据库上运行存储过程,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我正在尝试遍历所有非系统数据库并运行一个存储过程。此存储过程存在于所有用户数据库中 到目前为止,我发现: DECLARE @command varchar(1000) SELECT @command = 'USE ? SELECT name FROM sysobjects WHERE xtype = ''U'' ORDER BY name' USE @command; GO EXECUTE Support.CleanIndiciesAndShrinkDatabase; GO 我收到一个
DECLARE @command varchar(1000)
SELECT @command = 'USE ? SELECT name FROM sysobjects WHERE xtype = ''U'' ORDER BY name'
USE @command;
GO
EXECUTE Support.CleanIndiciesAndShrinkDatabase;
GO
我收到一个错误,该错误:
味精102,第15级,状态1,第3行“@command”附近的语法不正确 Msg 2812,第16级,状态62,第1行
找不到存储过程“Support.CleanIndicatiesAndShrinkDatabase”
有没有解决这个问题的建议 试试这样的方法:
DECLARE @DynamicTSQLStatement NVARCHAR(MAX);
SELECT @DynamicTSQLStatement = STUFF
(
(
SELECT 'USE [' + [name] + ']; EXECUTE Support.CleanIndiciesAndShrinkDatabase;'
FROM [sys].[databases]
WHERE [name] NOT IN ('master', 'tempdb', 'model', 'msdb')
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1
,1
,''
);
EXECUTE sp_executesql @DynamicTSQLStatement;
试试下面的方法
DECLARE @command varchar(1000)
DECLARE @spName VARCHAR(50)
SET @spName = 'Support.CleanIndiciesAndShrinkDatabase'
SELECT @command = 'IF ''?'' NOT IN(''master'', ''model'', ''msdb'', ''tempdb'')
BEGIN
USE ?
IF EXISTS(SELECT TOP 1 1 FROM sys.procedures AS P WHERE p.name = ''' + @spName + ''')
BEGIN
PRINT ''running '+ @spName + ' on '' + DB_NAME()
EXEC ' +@spName+'
END
ELSE
BEGIN
PRINT ''' + @spName + ' was on found on database '' + DB_NAME()''
END
END '
EXEC sp_MSforeachdb @command
它将在所有非系统数据库上运行。
现在,您得到的错误意味着SQL Server找不到存储过程。您可以通过在任何还没有存储过程的数据库上创建存储过程,然后运行它来修复此问题。
因此,更好的查询是
DECLARE @command varchar(1000)
DECLARE @schemaName VARCHAR(50)
DECLARE @spName VARCHAR(50)
SET @schemaName = 'Support'
SET @spName = 'CleanIndiciesAndShrinkDatabase'
SELECT @command = 'IF ''?'' NOT IN(''master'', ''model'', ''msdb'', ''tempdb'')
BEGIN
USE ?
IF NOT EXISTS(SELECT TOP 1 1
FROM sys.procedures AS P
INNER JOIN sys.schemas AS S ON S.schema_id = P.schema_id
WHERE p.name = ''' + @spName + '''
AND s.name = ''' + @schemaName + ''')
BEGIN
PRINT ''creating '+ @spName + ' on '' + DB_NAME()
IF NOT EXISTS ( SELECT TOP 1 1
FROM sys.schemas AS S
WHERE S.name = ''' + @schemaName + ''' )
BEGIN
PRINT ''CREATING SCHEMA ' + @schemaName + '''
EXEC ( '' CREATE SCHEMA ' + @schemaName + ''' );
END;
EXEC ( ''
CREATE PROCEDURE ' + @schemaName + '.' + @spName + '
AS
BEGIN
-- SP CODE GOES HERE
-- SELECT COUNT(*) FROM SYS.TABLES --uncomment this for check
END
'' );
END
PRINT ''running '+ @spName + ' on '' + DB_NAME()
EXEC ' + @schemaName + '.' + @spName +'
END '
EXEC sp_MSforeachdb @command
您可以尝试以下方法:
Create PROC PROC_NAME
AS
BEGIN
DECLARE @name nvarchar(50)
declare @cursor cursor
set @cursor = CURSOR FAST_FORWARD FOR select name from sys.databases where database_id > 4
open @cursor
FETCH NEXT FROM @cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @use nvarchar(50) = 'USE '
SET @use = @use + @name
Declare @query nvarchar(max) = @use + ' exec Your_PROC'
EXEC sp_executesql @query
FETCH NEXT FROM @cursor INTO @name
END
CLOSE @cursor
DEALLOCATE @cursor
END
请看Aaron Bertrand的《我得到的是
Msg 105,第15级,状态1,第11行未闭合引号》,在第一个示例中的字符串“
后面。我现在正在看第二个。我是否要用支持来替换东西。CleanIndicies和ShrinkDatabase
?我不确定我是否真的理解了这段代码。@TechGuy好的,请检查编辑。什么都不用做。