Цитата из статьи, на всякий случай.
sp_executesql и длинные строки SQL в SQL 2000
Существует ограничение с sp_executesql для SQL 2000 и SQL 7, поскольку вы не можете использовать более длинные строки SQL, чем 4000 символов. (В SQL 2005 и более поздних версиях вы должны использовать nvarchar (MAX), чтобы избежать этой проблемы.) Если вы хотите использовать sp_executesql, когда ваша строка запроса превышает этот лимит для использования параметризованных планов запросов, на самом деле существует обходной путь. Вы можете заключить sp_executesql в 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 +' '' ')
Это работает, потому что параметром @stmt для sp_executesql является ntext, поэтому сам по себе он не имеет никаких ограничений по размеру.
Вы даже можете использовать выходные параметры, используя INSERT-EXEC, как в этом примере:
CREATE TABLE #result (cnt int NOT NULL)
ЗАЯВИТЬ @ 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 ('ОБЪЯВЛЯЙТЕ @cnt int
EXEC sp_executesql N '' '+ @ sql1 + @ sql2 +' '',
N '' @ state char (2),
@cnt int OUTPUT '',
@state = '' '+ @state +' '',
@cnt = @cnt ВЫХОД
SELECT @cnt ')
SELECT @mycnt = cnt FROM # result
У вас есть понимание, если вы считаете, что это слишком грязно, чтобы того стоить.