我正在尝试做
INSERT INTO MYTBL
VALUES (CAST(SPACE(7997) + 'abcd' as nvarchar(max))
并且它不会超过8000个字节 不确定我做错了什么
MYTBL只有一列(Col1(nvarchar(max))
答案 0 :(得分:3)
基于你最后遗失的代码“)”
将您的代码修改为:
INSERT INTO MYTBL
VALUES (CAST(SPACE(7997) + 'abcd' as nvarchar(max)))
另外,就像@datagod所说,你需要在连接之前将字符串转换/转换为NVARCHAR(max)
。
你可以用这个
INSERT INTO MYTBL
VALUES ( CONVERT(NVARCHAR(MAX), SPACE(7997)) + CONVERT(NVARCHAR(MAX), 'abcd') )
答案 1 :(得分:2)
首先尝试将每个字符串转换为nvarchar(max),然后将它们连接起来。我发现像replicate()之类的字符串函数会返回常规的varchar结果,这些结果会在8000个字符后被截断。
答案 2 :(得分:1)
您投射的字符串为SPACE(7997) + 'abcd'
。此字符串的值为[{7997空格] varchar(8000)
abc
。
在应用CAST
操作之前评估串联。 CAST
将更改连接的结果的类型,但是使用CAST
连接连接表达式不会神奇地更改+
操作的评估方式。
SQL是一种强类型语言,并且每个表达式都必须具有明确定义的类型,该类型取决于操作数的类型,而不是操作数的值,而不是如何在更大的上下文中使用表达式。
SPACE(7997) + 'abcd'
的类型是[varchar(7997) + varchar(4)
]的结果类型,即varchar(8000)
,并且会发生截断。
这是一个类似的情况。
-- The `SELECT` fails, because the product of 2 and an `INT`has type `INT`
-- When `@i = 2000000000`, there is overflow.
declare @i int;
set @i = 2000000000;
select 2*@i;
-- The following also fails, for exactly the same reason, even though `BIGINT`
-- could hold the result.
declare @i int;
set @i = 2000000000;
select CAST(2*@i AS BIGINT);
-- This, however, succeeds, because now the type of the product is `BIGINT`
declare @i int;
set @i = 2000000000;
select CAST(2 AS BIGINT)*@i;