Quote from the article just in case.
sp_executesql and long SQL strings in SQL 2000
There is a limitation with sp_executesql on SQL 2000 and SQL 7, since you cannot use longer SQL strings than 4000 characters. (For SQL Server 2005 and later, you should use nvarchar (MAX) to avoid this problem.) If you want to use sp_executesql when the query string exceeds this limit to use parameterized query plans, there is actually a workaround. To do this, you can wrap sp_executesql in EXEC ():
DECLARE @ sql1 nvarchar (4000), @ sql2 nvarchar (4000), @state char (2) SELECT @state = 'CA' SELECT @ sql1 = N'SELECT COUNT (*) 'SELECT @ sql2 = N'FROM dbo.authors WHERE state = @state 'EXEC (' EXEC sp_executesql N '' '+ @ sql1 + @ sql2 +' '', N '' @state char (2) '', @state = '' '+ @state +' ' '')
This works because the @stmt parameter for sp_executesql is ntext, so by itself it has no size restrictions.
You can even use the output parameters with INSERT-EXEC, as in this example:
CREATE TABLE #result (cnt int NOT NULL) DECLARE @ sql1 nvarchar (4000), @ sql2 nvarchar (4000), @state char (2), @mycnt int SELECT @state = 'CA' SELECT @ sql1 = N'SELECT @ cnt = COUNT (*) 'SELECT @ sql2 = N'FROM dbo.authors WHERE state = @state' INSERT #result (cnt) EXEC ('DECLARE @cnt int EXEC sp_executesql N' '' + @ sql1 + @ sql2 + ' '', N '' @state char (2), @cnt int OUTPUT '', @state = '' '+ @state +' '', @cnt = @cnt OUTPUT SELECT @cnt ') SELECT @mycnt = cnt FROM #result
You have my understanding if you think it is too dirty to be worth it.