- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所有,我有一个大型(不可避免的)动态 SQL 查询。由于选择标准中的字段数量较多,包含动态 SQL 的字符串将增长到超过 4000 个字符。现在,我了解到 NVARCHAR(MAX)
的最大设置为 4000,但在 Server Profiler 中查看执行的 SQL 语句
DELARE @SQL NVARCHAR(MAX);
SET @SQL = 'SomeMassiveString > 4000 chars...';
EXEC(@SQL);
GO
似乎有效(!?),对于另一个也很大的查询,它会抛出一个与此 4000 限制相关的错误(!?),它基本上会修剪此 4000 限制之后的所有 SQL,并给我留下一个语法错误。尽管如此,在探查器中,它仍以完整(!?)的形式显示此动态 SQL 查询。
这里到底发生了什么?我应该将这个 @SQL 变量转换为 VARCHAR 并继续使用它吗?
感谢您的宝贵时间。
诗。如果能够打印出 4000 多个字符来查看这些大查询,那就太好了。以下限量4000个
SELECT CONVERT(XML, @SQL);
PRINT(@SQL);
还有其他很酷的方法吗?
最佳答案
I understand that there is a 4000 max set for
NVARCHAR(MAX)
你的理解是错误的。 nvarchar(max)
最多可存储(有时甚至超过)2GB 数据(10 亿个双字节字符)。
来自nchar and nvarchar在线书籍中的语法是
nvarchar [ ( n | max ) ]
|
性格意味着这些是替代品。即您指定任一个 n
或字面值 max
.
如果您选择指定特定的n
那么这必须在 1 到 4,000 之间,但使用 max
将其定义为大对象数据类型(替换已弃用的 ntext
)。
事实上,在 SQL Server 2008 中,对于变量来说,如果 tempdb
中有足够的空间,则可以无限期地超过 2GB 限制。 (Shown here)
关于您问题的其他部分
varchar(n) + varchar(n)
将在 8,000 个字符处截断。nvarchar(n) + nvarchar(n)
将在 4,000 个字符处截断。varchar(n) + nvarchar(n)
将在 4,000 个字符处截断。 nvarchar
具有更高的优先级,因此结果是 nvarchar(4,000)
[n]varchar(max)
+ [n]varchar(max)
不会截断(< 2GB)。varchar(max)
+ varchar(n)
不会截断(对于 < 2GB),结果将键入为 varchar(max)
.varchar(max)
+ nvarchar(n)
不会截断(对于 < 2GB),结果将键入为 nvarchar(max)
.nvarchar(max)
+ varchar(n)
首先会转换varchar(n)
输入nvarchar(n)
然后进行串联。 如果varchar(n)
的长度字符串大于 4,000 个字符,则强制转换为 nvarchar(4000)
并且会发生截断。如果您使用N
前缀且字符串长度 <= 4,000 个字符,它将被键入为 nvarchar(n)
哪里n
是字符串的长度。所以N'Foo'
将被视为 nvarchar(3)
例如。如果字符串长度超过 4,000 个字符,它将被视为 nvarchar(max)
如果您不使用N
前缀且字符串长度 <= 8,000 个字符,它将被键入为 varchar(n)
哪里n
是字符串的长度。如果长如varchar(max)
对于上述两种情况,如果字符串的长度为零,则 n
设置为 1。
1.CONCAT
函数在这里没有帮助
DECLARE @A5000 VARCHAR(5000) = REPLICATE('A',5000);
SELECT DATALENGTH(@A5000 + @A5000),
DATALENGTH(CONCAT(@A5000,@A5000));
以上两种连接方法都返回 8000。
2.小心 +=
DECLARE @A VARCHAR(MAX) = '';
SET @A+= REPLICATE('A',5000) + REPLICATE('A',5000)
DECLARE @B VARCHAR(MAX) = '';
SET @B = @B + REPLICATE('A',5000) + REPLICATE('A',5000)
SELECT DATALENGTH(@A),
DATALENGTH(@B);`
返回
-------------------- --------------------
8000 10000
请注意@A
遇到截断。
您会被截断,因为您连接了两个非 max
数据类型在一起或者因为您连接 varchar(4001 - 8000)
字符串到 nvarchar
输入字符串(甚至 nvarchar(max)
)。
为了避免第二个问题,只需确保所有字符串文字(或至少那些长度在 4001 - 8000 范围内的字符串文字)都以 N
开头。 .
为了避免第一个问题,请更改分配
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = 'Foo' + 'Bar' + ...;
至
DECLARE @SQL NVARCHAR(MAX) = '';
SET @SQL = @SQL + N'Foo' + N'Bar'
这样一个NVARCHAR(MAX)
从一开始就参与串联(因为每个串联的结果也将是 NVARCHAR(MAX)
这将传播)
确保您选择了“结果到网格”模式,然后就可以使用
select @SQL as [processing-instruction(x)] FOR XML PATH
SSMS 选项允许您为 XML
设置无限长度结果。 processing-instruction
bit 避免了诸如 <
等字符的问题显示为 <
.
关于SQL NVARCHAR 和 VARCHAR 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12639948/
我有一个 ServiceBusQueue(SBQ),它获取大量消息负载。我有一个具有 accessRights(manage) 的 ServiceBusTrigger(SBT),它不断轮询来自 SBQ
在下面给出的结果集中,有 2 个唯一用户 (id),并且查询中可能会出现更多此类用户: 这是多连接查询: select id, name, col1Code, col2Code, col2Va
我正在用 Python 2.7.3 编写一个带有 GRequests 的小脚本和 lxml 可以让我从各种网站收集一些收藏卡价格并进行比较。问题是其中一个网站限制了请求的数量,如果我超过它,就会发回
我想知道何时实际使用删除级联或删除限制以及更新级联或更新限制。我对使用它们或在我的数据库中应用感到很困惑。 最佳答案 在外键约束上使用级联运算符是一个热门话题。 理论上,如果您知道删除父对象也将自动删
下面是我的输出,我只想显示那些重复的名字。每个名字都是飞行员,数字是飞行员驾驶的飞机类型。我想显示驾驶不止一架飞机的飞行员的姓名。我正在使用 sql*plus PIL_PILOTNAME
我正在评估不同的移动框架,我认为 nativescript 是一个不错的选择。但我不知道开发过程是否存在限制。例如,我对样式有限制(这并不重要),但我想知道将来我是否可以有限制并且不能使用某些 nat
我正在尝试使用 grails 数据绑定(bind)将一些表单参数映射到我的模型中,但我认为在映射嵌入式集合方面可能存在一些限制。 例如,如果我提交一些这样的参数,那么映射工作正常: //this wo
是否可以将 django 自过滤器起的时间限制为 7 天。如果日期超过 7 天,则不应用过滤器 最佳答案 timesince 的源代码位于 django/django/utils/timesince.
我想在我的网站上嵌入一个 PayPal 捐赠按钮。但问题是我住在伊朗——这个国家受到制裁,人们不使用国际银行账户或主要信用卡。 有什么想法吗?请帮忙! 问候 沮丧 最佳答案 您可以在伊朗境内使用为伊朗
这是我的查询 select PhoneNumber as _data,PhoneType as _type from contact_phonenumbers where ContactID = 3
这个问题在这里已经有了答案: What is the maximum number of parameters passed to $in query in MongoDB? (4 个答案) 关闭
我的一个项目的 AndroidManifest.xml 变得越来越大(> 1000 行),因为我必须对某些文件类型使用react并且涵盖所有情况变得越来越复杂。我想知道 list 大小是否有任何限制。
在使用 Sybase、Infomix、DB2 等其他数据库产品多年后使用 MySQL 5.1 Enterprise 时;我遇到了 MySQL 不会做的事情。例如,它只能为 SELECT 查询生成 EX
这个问题在这里已经有了答案: What is the maximum number of parameters passed to $in query in MongoDB? (4 个回答) 关闭5年
通常我们是在{$apache}/conf/httpd.conf中设置Apache的参数,然而我们并没有发现可以设置日志文件大小的配置指令,通过参考http://httpd.apache.org/do
我正在搜索最大的 Android SharedPreferences 键值对,但找不到任何好的答案。其次,我想问一下,如果我有一个键,它的字符串值限制是多少。多少字符可以放入其中。如果我需要频繁更改值
我目前正在试验 SoundCloud API,并注意到我对/tracks 资源的 GET 请求一次从不返回超过 200 个结果。关于这个的几个问题: 这个限制是故意的吗? 有没有办法增加这个限制? 如
我正在与一家名为 Dwolla 的金融技术公司合作,该公司提供了一个 API,用于将银行信息附加到用户并收取/发送 ACH 付款。 他们需要我将我的 TLS 最低版本升级到 1.2(禁用 TLS 1.
我在 PHP 中有一个多维数组,如下所示: $array = Array ( [0] => Array ( [bill] => 1 ) [1] => Array ( [
我在获取下一个查询的第一行时遇到了问题: Select mar.Title MarketTitle, ololo.NUMBER, ololo.Title from Markets mar JOIN(
我是一名优秀的程序员,十分优秀!