【问题标题】:Inconsistent results using a VarChar or NVarChar parameter with EXECUTE [master].[sys].[sp_executesql]使用带有 EXECUTE [master].[sys].[sp_executesql] 的 VarChar 或 NVarChar 参数的结果不一致
【发布时间】:2016-10-18 06:22:47
【问题描述】:

我已经在多行代码中构建了 T-SQL 变量 @Foo

如果@Foo 被声明为VarChar(MAX),紧随其后的PRINT 语句输出我所期望的(5,421 个字符)。

但是,后面的 EXECUTE 语句会失败,因为它需要 NVarChar 参数。

当我将 @Foo 的声明更改为 NVarChar(MAX) 时,PRINT 语句仅打印出我所期望的子集(3,902 个字符)。输出被截断。

@Foo是多个变量的串联,都是VarChar(MAX)。在我上链之前,将所有前任变量更改为 NVarChar(MAX) 以继续测试,我想知道是否有人对这种不一致的行为有所了解。

PRINT @Foo

EXECUTE [master].[sys].[sp_executesql] @Foo

非常感谢。

基思

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    正如MSDN PRINT 所说,

    如果消息字符串是 非 Unicode 字符串,如果是 Unicode,则长度为 4,000 个字符 细绳。较长的字符串被截断。 varchar(max)nvarchar(max) 数据类型被截断为没有 大于 varchar(8000)nvarchar(4000)

    sp_executesql 不适用这些限制。

    【讨论】:

    • 谢谢亚历克斯。那么,您知道如何使用 sp_executesql 来运行包含在变量中的 5,000 个字符的 T-SQL 表达式吗?我似乎处于 catch-22 中 - sp_executesql 需要 NVarChar,而 NVarChar 的上限为 4,000 个字符。我可以做的一件棘手的事情是将执行语句放在循环中,我目前正在迭代连接 T-SQL 代码以在循环之后累积执行,但这并不理想。谢谢。
    • sp_executesql 没有这样的限制。见msdn.microsoft.com/en-us/library/ms188001.aspx
    • 嗨,亚历克斯。我认为我的用户体验与您的反馈不一致。我在执行 VarChar 参数时收到以下消息:过程需要类型为“ntext/nchar/nvarchar”的参数“@statement”。此外,此链接似乎相反:stackoverflow.com/questions/2743890/…
    • 正如sp_executesql 规范读取@stmt(第一个参数)必须是nvarchar(长度)max 可以。该值必须以 N declare @stmt nvarchar(max) = N'select....' 开头。 “在 64 位服务器上,字符串的大小限制为 2 GB,即 nvarchar(max) 的最大大小。”再次阅读上面的链接。
    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多