sql-server - 在模式之间复制大过程

标签 sql-server tsql 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);

但是我遇到了大程序(超过 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);

关于sql-server - 在模式之间复制大过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57716093/

相关文章:

C# : how to stop timezone offset being added to System. DateTime 插入 DateTimeOffset SQL Server 列时

sql-server - 光标内的IDENTITY_INSERT ON不允许插入ID

sql-server - 您能解释一下以下代码中 sys.sp_addextendedproperty 的使用吗?

sql - 可以在不指定数据库名称的情况下对当前数据库进行收缩吗

sql - 如何从数据 View 中忽略与 'Arithmetic Overflow' 相关的错误?

sql-server - 在开始/结束日期将记录拆分为多个记录

sql - 使用锁和有序输出更新数据库队列

c# - 我在哪里/如何在我的 C# 代码中编写 T-SQL 并获得结果 (Visual Studio 2008)

sql-server - 查询运行速度快,但存储过程运行速度慢

C# SQL Server 存储过程参数返回列表