DECLARE @SQL nvarchar(MAX) = (
SELECT STRING_AGG(Code, '')
FROM DatabaseA.dbo.YourSequenceTable);
EXEC DatabaseB..sp_executesql @SQL;
GO
如果STRING_AGG不可用(SQL Server 2017 之前的版本),请替换FOR XML聚合字符串连接:
DECLARE @SQL nvarchar(MAX) = (SELECT
(SELECT Code
FROM DatabaseA.dbo.YourSequenceTable
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
);
EXEC DatabaseB..sp_executesql @SQL;
GO
我首先想到的是CURSORand sys.sp_executesql。创建一个贯穿所有创建脚本的游标。每次要执行新脚本时,为正确的数据库加上 using 前缀并让它执行。
例子
USE [source database];
CREATE TABLE dbo.sequence_data (code VARCHAR(MAX) NOT NULL);
INSERT INTO dbo.sequence_data (code)
VALUES
('CREATE SEQUENCE dbo.first_one START WITH 1 INCREMENT BY 1;'),
('CREATE SEQUENCE dbo.second_one START WITH 1 INCREMENT BY 1;'),
('CREATE SEQUENCE dbo.third_one START WITH 1 INCREMENT BY 1;');
DECLARE creation_cursor CURSOR LOCAL FAST_FORWARD READ_ONLY FOR
SELECT code
FROM dbo.sequence_data;
DECLARE @sql NVARCHAR(MAX);
OPEN creation_cursor;
FETCH NEXT FROM creation_cursor
INTO @sql;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = CONCAT(N'USE [target database]; ', @sql);
EXECUTE sys.sp_executesql @stmt = @sql;
FETCH NEXT FROM creation_cursor
INTO @sql;
END;
CLOSE creation_cursor;
DEALLOCATE creation_cursor;
DROP TABLE dbo.sequence_data;
从源表构建脚本使用并使用目标数据库名称限定的
STRING_AGG
执行它。sp_executesql
这将避免需要游标:如果
STRING_AGG
不可用(SQL Server 2017 之前的版本),请替换FOR XML
聚合字符串连接:我首先想到的是
CURSOR
andsys.sp_executesql
。创建一个贯穿所有创建脚本的游标。每次要执行新脚本时,为正确的数据库加上 using 前缀并让它执行。例子
当然,如果这是一次性的事情并且没有真正需要自动化:
SELECT
所有创建脚本,将它们放在 SSMS 查询中,连接到所需的目标数据库并执行脚本。