将脚本字符串按GO分割再执行

来源:互联网 发布:ios软件开发工具 编辑:程序博客网 时间:2024/06/04 01:12

我们平常得到的脚本往往含有GO, 这是无法用动态语句直接执行的, 但有时GO不能直接去掉(比如create view之类), 如何处理?

1. 需要按行分割表值函数:Fun_SplitByLine

2. 增加一个存储即可:

IF OBJECT_ID('dbo.Proc_DBA_ExecBySplitGo') IS NOT NULLDROP PROC dbo.Proc_DBA_ExecBySplitGoGO-- =============================================-- Author:yenange-- Create date: 2017-12-19-- Description:将一个脚本字符串按GO分割后执行-- =============================================CREATE PROCEDURE dbo.Proc_DBA_ExecBySplitGo@sql NVARCHAR(MAX)='select 1 as rgoselect 2 as rgo 'ASBEGINSET NOCOUNT ON;IF ISNULL(@sql,'')=''BEGINRAISERROR ('SQL脚本字符串为空!',16,1)RETURN;END--1. 将语句分割DECLARE @t TABLE(rowNum INT,line   NVARCHAR(MAX))INSERT INTO @t(rowNum,line)SELECT rowNum,line FROM dbo.Fun_SplitByLine(@sql)DECLARE @tempSql NVARCHAR(MAX),@i INT,@iMax INT,@line NVARCHAR(MAX),@times INTSELECT @i=1,@iMax=MAX(rowNum),@tempSql='',@times=1 FROM @tWHILE @i<=@iMaxBEGINSELECT @line=line FROM @t WHERE rowNum=@iIF ltrim(rtrim(@line))='GO' OR @i=@iMaxBEGINPRINT ''PRINT '----'+CAST(@times AS VARCHAR(50))+'. 分割执行'PRINT @tempSqlEXEC (@tempSql)SET @tempSql=''SET @times=@times+1ENDELSEBEGINSET @tempSql=CASE WHEN @tempSql='' THEN @line ELSE @tempSql+''+@lineENDENDSET @i=@i+1ENDENDGO