sql-server - 在模式之间复制大过程
问题描述
我有一个定义过程的模式。此过程可以修改,并且应该在所有租户之间复制(我们有基于模式的租户)。主要思想是拥有某种模板化的过程,这些过程将在过程被修改后通过其他租户的模式自动更新。为了编写这个“复制”过程,我写了这样的东西:
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);
但是我遇到了大程序(超过 17k 个符号)的问题。它不能被复制,因为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
使用您的示例:
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);
推荐阅读
- autocomplete - 如何更改 Visual Studio 代码自动更正花括号的方式?
- python - 通过 TensorFlow 消费大数据
- docker - 在 Kubernetes 集群中部署内部 docker 镜像
- html - 在 html 中显示多张图片,而无需为每一张都写一个标签
- dart - Flutter:覆盖触发重建中的文本字段
- javascript - 如何使用 javascript 显示/隐藏复数 div?
- java - 如果在 Java 中使用原始类型,如何强制编译错误以强制泛型类型参数?
- node.js - 如何在 Node.js 中正确调用 AWS.CloudFront.Signer?
- node.js - 为什么将 ESM 转换为 CommonJS 不是简单的查找和替换?
- python - RabbitMQ pika.exceptions.ConnectionClosed (-1, "error(104, 'Connection reset by peer')")