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。你介意把这个作为你问题的答案吗?谢谢,亚历克斯。你介意把这个作为你问题的答案吗?