dan*_*y89 3 t-sql sql-server stored-procedures
我有一个已定义过程的架构。此过程可以修改,应该在所有租户之间复制(我们有基于架构的租约)。主要思想是拥有某种模板化过程,这些过程在修改过程后将通过其他租户的模式自动更新。为了编写此“复制”过程,我编写了以下内容:
DECLARE
@proc_name NVARCHAR(150) = 'ProcedureToCopy',
@proc_sql NVARCHAR(MAX),
@schema_name NVARCHAR(MAX) = 'test';
SELECT
@proc_sql = REPLACE(ROUTINE_DEFINITION, '[templates].', '['+@schema_name+'].')
FROM
INFORMATION_SCHEMA.ROUTINES
WHERE
ROUTINE_TYPE='PROCEDURE' AND
ROUTINE_NAME = @proc_name AND
ROUTINE_SCHEMA = 'templates'
PRINT(@proc_sql);
EXEC(@proc_sql);
Run Code Online (Sandbox Code Playgroud)
但是我遇到了大程序(超过17,000个符号)的问题。由于只能NVARCHAR(MAX)用4k符号限制,因此无法复制,因此我@proc_sql被裁剪了,并且不包含所有必需的过程定义。
有人可以为我的问题提出解决方案,或者其他方法吗?
您应该可以使用它而不是INFORMATION_SCHEMA.ROUTINES。
SELECT o.name, definition, LEN(definition), o.type_desc
FROM sys.sql_modules m
INNER JOIN sys.objects o
ON m.object_id = o.object_id
Run Code Online (Sandbox Code Playgroud)
使用您的示例:
DECLARE @proc_name NVARCHAR(150) = 'doSomething',
@proc_sql NVARCHAR(MAX),
@schema_name NVARCHAR(MAX) = 'dbo';
SELECT @proc_sql = REPLACE(m.definition, '[templates].', '[' + @schema_name + '].')
--select *
FROM sys.sql_modules m
INNER JOIN sys.objects o
ON m.object_id = o.object_id
WHERE
o.type_desc = 'sql_stored_Procedure'
AND o.name = @proc_name
AND SCHEMA_NAME(o.schema_id) = @schema_name
PRINT (@proc_sql);
EXEC (@proc_sql);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37 次 |
| 最近记录: |