動的クエリについて読む必要があります... The Curse and Blessings of Dynamic SQLを読むことを強くお勧めします。今回は役に立たなかったかもしれませんが、将来必ず役に立ちます。
念のため記事から引用。
sp_executesql と SQL 2000 の長い SQL 文字列
SQL 2000 および SQL 7 では、4000 文字を超える長い SQL 文字列を使用できないため、sp_executesql には制限があります。(SQL 2005 以降では、この問題を回避するために nvarchar(MAX) を使用する必要があります。) パラメータ化されたクエリ プランを利用するためにクエリ文字列がこの制限を超えたときに sp_executesql を使用する場合、実際には回避策があります。つまり、EXEC() で sp_executesql をラップできます。
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 + '' '')
sp_executesql への @stmt パラメーターは ntext であるため、これは機能し、それ自体ではサイズに制限はありません。
次の例のように、INSERT-EXEC を使用して出力パラメーターを使用することもできます。
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 #結果
これが面倒すぎて価値がないと思うなら、あなたは私の理解を持っています.