This seems a whole lot simpler than what you have: CREATE TABLE #tmp ( db sysname, sch sysname, obj sysname, name sysname, is_disabled bit, def nvarchar(max) ); GO INSERT #tmp SELECT DB_NAME(), s.name, o.name, t.name, t.is_disabled, m.definition FROM sys.triggers AS t INNER JOIN sys.sql_modules AS m ON t.object_id = m.object_id INNER JOIN sys.objects AS o ON t.parent_id = o.object_id INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id WHERE parent_class = 1; When you're ready to create them again: DECLARE @sql nvarchar(max) = N''; SELECT @sql += def + CHAR(13) + CHAR(10) + N'GO' + CHAR(13) + CHAR(10) FROM #tmp; SELECT @sql += N'DISABLE TRIGGER ' + QUOTENAME(sch) + N'.' + QUOTENAME(name) + N' ON ' + QUOTENAME(sch) + N'.' + QUOTENAME(obj) + N';' FROM #tmp WHERE is_disabled = 1; PRINT @sql; -- EXEC sys.sp_executesql @sql; Yes, you won't be able to validate the entire script is there, because SSMS won't output the entire value of `@sql`. See [this post for workarounds](https://www.mssqltips.com/sqlservertip/3185/validate-the-contents-of-large-dynamic-sql-strings-in-sql-server/). Also, I don't know why you need the database as part of the dynamic script if you always know the database you're affecting, but there's a much safer way to make the database name dynamic without concatenating values and inviting SQL injection: DECLARE @db sysname = N'AdventureWorks'; DECLARE @exec nvarchar(max), @sql nvarchar(max); SET @exec = QUOTENAME(@db) + N'.sys.sp_executesql'; SET @sql = N'SELECT DB_NAME();'; EXEC @exec @sql;