Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:尝试将大字符串插入varchar(max)_Sql_Sql Server_Tsql - Fatal编程技术网

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

SQL:尝试将大字符串插入varchar(max),sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在试着做一件事 INSERT INTO MYTBL VALUES (CAST(SPACE(7997) + 'abcd' as nvarchar(max)) 它不超过8000字节 不确定是什么我做错了 MYTBL只有一列(Col1(nvarchar(max))首先尝试将每个字符串转换为nvarchar(max),然后将它们连接起来。我发现诸如replicate()之类的字符串函数返回常规的varchar结果,这些结果在8000个字符后被截断。尝试将每个字符串转换为nvarchar(max)

我正在试着做一件事

INSERT INTO MYTBL
VALUES (CAST(SPACE(7997) + 'abcd' as nvarchar(max)) 
它不超过8000字节 不确定是什么我做错了


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

首先尝试将每个字符串转换为nvarchar(max),然后将它们连接起来。我发现诸如replicate()之类的字符串函数返回常规的varchar结果,这些结果在8000个字符后被截断。

尝试将每个字符串转换为nvarchar(max)首先,然后连接它们。我发现诸如replicate()之类的字符串函数会返回常规的varchar结果,这些结果在8000个字符之后会被截断。

根据您最后缺少的代码“”

将您的代码修改为:

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') )

根据您的代码,您最后缺少了“)”

将您的代码修改为:

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') )

您正在转换的字符串是
空格(7997)+“abcd”
。此字符串是[7997空格]
abc
varchar(8000)

在应用
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;

您正在转换的字符串是
空格(7997)+“abcd”
。此字符串是[7997空格]
abc
varchar(8000)

在应用
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;

这很有效;不过,做这样一个简单的插入需要这些动作,这感觉有点奇怪。这并不奇怪,也不是“做这样一个简单的插入”的要求。这是为了改变
+
操作的工作方式。如果在T-SQL中连接
varchar(7997)
varchar(4)
,则始终会得到带有截断的
varchar(8000)
。这就是语言的输入方式。如果您想要连接字符串的所有8001个字符,则需要向另一个字符串添加
varchar(max)
。您必须更改要连接的类型。您只需要将其中一个字符串强制转换为
NVARCHAR(MAX)
,因为
+
如果其中一个操作数是长类型,则返回一个长字符串类型。此操作正常;不过,做这样一个简单的插入需要这些动作,这感觉有点奇怪。这并不奇怪,也不是“做这样一个简单的插入”的要求。这是为了改变
+
操作的工作方式。如果在T-SQL中连接
varchar(7997)
varchar(4)
,则始终会得到带有截断的
varchar(8000)
。这就是语言的输入方式。如果您想要连接字符串的所有8001个字符,则需要向另一个字符串添加
varchar(max)
。您必须更改要连接的类型。您只需要将其中一个字符串强制转换为
NVARCHAR(MAX)
,因为
+
如果任一操作数都是长类型,则返回长字符串类型。谢谢,Alex。你介意把这个作为你问题的答案吗?谢谢,亚历克斯。你介意把这个作为你问题的答案吗?