SQL:尝试将大字符串插入varchar(max)

时间:2014-04-22 17:22:29

标签: sql sql-server tsql

我正在尝试做

INSERT INTO MYTBL
VALUES (CAST(SPACE(7997) + 'abcd' as nvarchar(max)) 

并且它不会超过8000个字节 不确定我做错了什么

MYTBL只有一列(Col1(nvarchar(max))

3 个答案:

答案 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;