Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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 如何在选定数据库的所有过程中更新公共参数的数据类型_Sql_Sql Server_Database_Sql Server 2008_Stored Procedures - Fatal编程技术网

Sql 如何在选定数据库的所有过程中更新公共参数的数据类型

Sql 如何在选定数据库的所有过程中更新公共参数的数据类型,sql,sql-server,database,sql-server-2008,stored-procedures,Sql,Sql Server,Database,Sql Server 2008,Stored Procedures,是否有机会在特定数据库中一次更新所有过程中的数据类型值?例如,我有具有以下凭据的过程 @password varchar(50), @employeeEmail varchar(150) 现在我需要更新“@password”,比如 @password varchar(100), @employeeEmail varchar(150) 这是一个简单的解决方案,找到所有包含搜索字符串的过程,循环遍历它们,并在定义中替换该字符串,然后运行它。这是一个非常简单的解决方案,没有错误检查或事务,但显示了

是否有机会在特定数据库中一次更新所有过程中的数据类型值?例如,我有具有以下凭据的过程

@password varchar(50),
@employeeEmail varchar(150)
现在我需要更新“@password”,比如

@password varchar(100),
@employeeEmail varchar(150)

这是一个简单的解决方案,找到所有包含搜索字符串的过程,循环遍历它们,并在定义中替换该字符串,然后运行它。这是一个非常简单的解决方案,没有错误检查或事务,但显示了可以做什么

DECLARE @searchstr VARCHAR(50), @replacestr VARCHAR(50), @str VARCHAR(MAX), @name VARCHAR(40)
SET @searchstr = '@password varchar(50),'
SET @replacestr = '@password varchar(100),'

DECLARE test_cursor CURSOR READ_ONLY FOR 
SELECT name, object_definition(OBJECT_ID)
FROM sys.objects
WHERE object_definition(OBJECT_ID) LIKE '%' + @searchstr + '%'
and type = 'P'

OPEN test_cursor

FETCH NEXT FROM test_cursor INTO @name, @str
WHILE (@@FETCH_STATUS <> -1)
BEGIN
    IF (@@FETCH_STATUS <> -2)
    BEGIN
        PRINT @name
        SET @str = REPLACE(@str, @searchstr, @replacestr)
        EXEC ('drop proc ' + @name)
        EXEC (@str)
    END
    FETCH NEXT FROM test_cursor INTO @name, @str
END

CLOSE test_cursor
DEALLOCATE test_cursor
尝试

下面将生成一个脚本,仅在以下情况下更改所有目标过程

1-过程不是系统存储过程,即名称不以sp\开头。 2-过程有一个名为@password的参数

。。。希望您没有任何用户定义的以sp_3;开头的过程名称

创建脚本后,请仔细查看脚本。备份您的数据库,一旦高兴,然后执行脚本。快乐的日子

 SET NOCOUNT ON;

-- Table to hold names of all the user defined Procedures
CREATE TABLE #UD_Procedures (Proc_Num INT IDENTITY(1,1), Proc_Name NVARCHAR(128))
GO

-- Table to hold Definitions of all the user defined Procedures
CREATE TABLE #UD_Proc_Definitinos (Def NVARCHAR(MAX))
GO

-- Populate Procedure Names table
INSERT INTO #UD_Procedures
SELECT OBJECT_NAME([OBJECT_ID])
 FROM sys.all_parameters ap
WHERE EXISTS  (SELECT 1
               FROM sys.procedures p 
               WHERE LEFT(name, 3) <> 'sp_'
                 AND OBJECT_NAME(ap.[object_id]) = p.name)
AND ap.Name = '@password'
GO


    DECLARE @Proc_Name NVARCHAR(128);

WHILE EXISTS(SELECT 1 FROM #UD_Procedures)
 BEGIN


     SELECT TOP 1 @Proc_Name = Proc_Name 
     FROM #UD_Procedures 
     ORDER BY Proc_Num

     INSERT INTO #UD_Proc_Definitinos
     EXECUTE sp_helptext @Proc_Name

     INSERT INTO #UD_Proc_Definitinos
     VALUES ('GO', ' ', ' ')

     DELETE FROM #UD_Procedures WHERE Proc_Name = @Proc_Name
 END


UPDATE #UD_Proc_Definitinos
 SET Def =    REPLACE(
                REPLACE(
                  REPLACE(
                     Def
                        ,'CREATE PROCEDURE', 'ALTER PROCEDURE')
                          ,'CREATE PROC', 'ALTER PROCEDURE')
                            ,'@password varchar(50)', ' @password varchar(100) '
                          )

-- Now select "Result to text file" and execute the following 

SELECT * FROM #UD_Proc_Definitinos

-- Save the file and Copy paste into SSMS and execute,,, 
-- just be on safe side backup your DB before you do anything :)

--  DROP temp tables 

DROP TABLE #UD_Procedures
GO
DROP TABLE #UD_Proc_Definitinos
GO

没有神奇的方法可以做到这一点-您必须1枚举所有存储过程,2查看它们的源代码和定义的参数,如果有必要,3将其存储的源代码更新到新的情况有一种方法我可以将所有过程放在一个表中,那么为什么我不能更新该过程中的文本。在我的数据库中总共有900个过程,光标会工作吗?我认为这不应该是一个问题,为了安全起见,请确保您进行了备份或在测试数据库上尝试此操作。要查看它是否有效,请限制用TOP关键字替换的过程数,如TOP 10左右。通过这种方式,您可以分块进行更新