Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 需要在所有非系统数据库上运行存储过程_Sql Server_Tsql_Sql Server 2012 - Fatal编程技术网

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好的,请检查编辑。什么都不用做。