【问题标题】:How do I execute a very long dynamic sql statement?如何执行很长的动态 sql 语句?
【发布时间】:2011-03-12 13:12:45
【问题描述】:

我记得那天我会制作一大堆 nvarchar(4000) 变量,随着它们的增长检查它们的长度,当它们填满时将它们切换出来,然后将整个混乱连接在一起以进行 exec 调用。我想知道是否有更简单的方法。

谢谢!

编辑:

代码示例,显示我搞砸了案例陈述

DECLARE @sql NVARCHAR(MAX)
SELECT @sql = CAST(N'SELECT ' AS NVARCHAR(MAX))

DECLARE @Index INT
SELECT @Index = 0

WHILE (@Index < 1000)
BEGIN
 SELECT @sql = CAST(@sql AS NVARCHAR(MAX)) + CAST(N'          ' AS NVARCHAR(MAX)) + CAST( CASE @Index WHEN 1 THEN N' ' END AS NVARCHAR(MAX))
 SELECT @Index = @Index + 1
END
SELECT @sql = CAST(@sql AS NVARCHAR(MAX)) + CAST(1 AS NVARCHAR(MAX))

SELECT LEN(@sql)
EXECUTE sp_executesql @sql

【问题讨论】:

  • 我可能不明白这个问题,但为什么不使用 nvarchar(MAX) 变量 - (SQL 2005 及更高版本)?
  • 有什么问题?动态 SQL 意味着字符串连接...
  • @Tommy - 添加您的评论作为答案。现货
  • @AdaTheDev - 有人打败了我 :)

标签: sql-server tsql dynamic-sql


【解决方案1】:

sp_executesql 接受 NVARCHAR(MAX) 类型的参数,该参数可以增长到 2GB。不需要任何噱头,因为 NVARCHAR(MAX) 类型支持所有字符串操作(连接、替换等):

[ @statement= ] statement

Is a Unicode string that contains a Transact-SQL statement or batch.

语句必须是 Unicode 常量或 Unicode 变量。更多的 复杂的 Unicode 表达式,例如 用 + 连接两个字符串 运营商,不允许。特点 不允许使用常量。如果一个 指定了 Unicode 常量,它必须 以 N 为前缀。例如, Unicode 常数 N'sp_who' 是 有效,但字符常量 'sp_who' 不是。 的大小 字符串仅受可用的限制 数据库服务器内存。在 64 位上 服务器,字符串的大小是 限制为 2 GB,最大大小为 nvarchar(最大值)。

【讨论】:

  • 希望我能在 SQL Server 2005 + 上部署这个应用程序
  • 请注意一些字符串函数: DECLARE @x nvarchar(max) SET @x = REPLICATE('a',10000) SELECT LEN(@x) -- 8000 -- 需要被 SET @x = REPLICATE(CAST('a' AS nvarchar(max)),10000)
  • 我的 NVARCHAR(MAX) 变量仍然不能超过 4k 个字符。 :(
  • 啊!一个案例陈述把我搞砸了!再次感谢莱姆斯。
  • 64 位限制为 2 GB?我认为这是 32 位的限制。
【解决方案2】:

EXEC (@YourSQL)sp_exectesql 如果您希望继续构建动态 SQL 并执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多