Skip to content

Instantly share code, notes, and snippets.

@nescalante
Created July 24, 2014 13:29
Show Gist options
  • Save nescalante/c9c77c96a716f4450c0d to your computer and use it in GitHub Desktop.
Save nescalante/c9c77c96a716f4450c0d to your computer and use it in GitHub Desktop.
RunScript Stored Procedure
IF ( OBJECT_ID('dbo.RunScript') IS NOT NULL )
DROP PROCEDURE dbo.RunScript
GO
CREATE PROCEDURE dbo.RunScript
@scriptUrl nvarchar(max)
AS
BEGIN
SET NOCOUNT ON
DECLARE @retval nvarchar(max)
DECLARE @sql nvarchar(500) = NULL;
DECLARE @scriptName nvarchar(600);
DECLARE @paramDef nvarchar(500) = N'@retvalOUT nvarchar(max) OUTPUT';
SET @scriptName = CASE
WHEN charindex('\', @scriptUrl) = 0 THEN @scriptUrl
ELSE reverse(left(reverse(@scriptUrl), charindex('\', reverse(@scriptUrl)) - 1)) END
BEGIN TRY
SELECT @sql = 'SELECT @retvalOUT = BulkColumn FROM OPENROWSET(BULK ''' + @scriptUrl + ''', SINGLE_CLOB) AS Contents'
exec sp_executesql @sql, @paramDef, @retvalOUT = @retval OUTPUT;
END TRY
BEGIN CATCH
-- try to run script as text
SET @retval = @scriptUrl
END CATCH
DECLARE @count int
select @count = count(Name) from Script where Name = @scriptName and RanOk = 1
IF (@count = 0)
BEGIN
BEGIN TRY
BEGIN TRANSACTION
EXEC(@retval)
COMMIT TRANSACTION
INSERT INTO [dbo].[Script] ([Name], [Date], [RanOk], [Observation])
VALUES (@scriptName, GETDATE(), 1, NULL)
PRINT 'SCRIPT [' + @scriptName +'] COMPLETED SUCCESSFULLY'
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
DECLARE @error nvarchar(255)
set @error = ERROR_MESSAGE()
INSERT INTO [dbo].[Script] ([Name], [Date], [RanOk], [Observation])
VALUES (@scriptName, GETDATE(), 0, @error)
PRINT 'SCRIPT [' + @scriptName +'] FAILED'
PRINT 'Error:' + @error
END CATCH
END
ELSE
BEGIN
PRINT 'SCRIPT [' + @scriptName +'] WAS PREVIUSLY RUN'
END
END
GO
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment