【问题标题】:Execute very long statements in TSQL using sp_executesql使用 sp_executesql 在 SQL 中执行很长的语句
【发布时间】:2011-11-16 11:46:08
【问题描述】:

我想执行大约 10,000 个字符的动态 SQL 语句。

当我使用 sp_executesql 如下:

DECLARE @stmt varchar(MAX)

SET @stmt = 'xxxxxxxx.................' which is about 10,000 characters

EXEC sp_executesql @stmt

我收到以下错误

The character string that starts with '  select t1.e_reference xxxxxxxxxxx' is too long. Maximum length is 8000. 

据我所知,我们可以使用 sp_executesql 来执行很长的语句,不是吗?

我使用的是 SQL Server 2008,企业版,64 位。

我怎样才能做到这一点?谢谢。

【问题讨论】:

  • 用 nvarchar(max) 试试,它需要一个 nvarchar 参数,所以你的 varchar 必须被转换,导致问题的可能性很小
  • 我也用 nvarchar(MAX) 试过了。但它不起作用。
  • 你能显示更多你的实际查询吗?我无法重现这个。事实上,我什至在sys.messages 中都看不到那个错误。您在查询链接服务器吗?
  • 是的,马丁。我正在查询 Oracle 链接服务器。
  • 链接服务器部分是一种重要信息,感谢 Martin 了解它

标签: sql-server sql-server-2008 tsql sp-executesql


【解决方案1】:

根据您在帖子中的回复,您使用的是linked server。 8000 char 限制不是由 sp_executesql 提出的,而是由您可能在变量 @stmt 中使用的 OPENQUERY 提出的。

MSDN 对 OPENQUERY 的论点这样说:

'query'是在链接服务器中执行的查询字符串。最大值 string 的长度为 8 KB。

http://msdn.microsoft.com/en-us/library/ms188427.aspx

要绕过这个,你可以使用

execute (@query) at oracle_linked_server

【讨论】:

    【解决方案2】:

    MSDN 说这有点含糊: “字符串的大小仅受可用数据库服务器内存的限制。在 64 位服务器上,字符串的大小限制为 2 GB,最大大小为 nvarchar(max)。”

    在 64 位服务器上,限制为 2GB。不清楚 32 位服务器的限制是什么?是 4000 还是 8000,无论可用内存,2GB 吗?

    【讨论】:

      【解决方案3】:

      sp_executesql 的 @stmt 参数的数据类型为 nvarchar(8000),因此您已超出限制。

      要么将 SQL 语句重构为更小的部分,要么将 SQL 放入存储过程中。

      【讨论】:

      猜你喜欢
      • 2011-03-12
      • 2014-02-01
      • 1970-01-01
      • 2011-07-29
      • 2015-09-26
      • 2015-04-30
      • 1970-01-01
      • 2019-11-09
      • 2021-01-02
      相关资源
      最近更新 更多