动态查询必读...动态 SQL 的诅咒和祝福,我强烈推荐你阅读它。这次可能对你没有帮助,但它肯定会在未来帮助你..
从文章中引用,以防万一。
SQL 2000 中的 sp_executesql 和长 SQL 字符串
在 SQL 2000 和 SQL 7 上 sp_executesql 有一个限制,因为您不能使用超过 4000 个字符的 SQL 字符串。(在 SQL 2005 及更高版本上,您应该使用 nvarchar(MAX) 来避免此问题。)如果您想在查询字符串超过此限制时使用 sp_executesql 以使用参数化查询计划,实际上有一种解决方法。也就是说,您可以将 sp_executesql 包装在 EXEC() 中:
声明 @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来自#结果
如果您认为这太混乱而不值得,您可以理解我的理解。