Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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 无法在NVARCHAR和VARCHAR中存储5000个字符_Sql_Sql Server_Stored Procedures_Varchar_Nvarchar - Fatal编程技术网

Sql 无法在NVARCHAR和VARCHAR中存储5000个字符

Sql 无法在NVARCHAR和VARCHAR中存储5000个字符,sql,sql-server,stored-procedures,varchar,nvarchar,Sql,Sql Server,Stored Procedures,Varchar,Nvarchar,我必须在SP中创建一个动态sql查询。动态查询是5000个字符,我使用了NVARCHAR(MAX)、VARCHAR(MAX)、NVARCHAR(6000)、VARCHAR(6000),但它们都截断为4000个字符 DECLARE @SCRIPT VARCHAR(8000) set @SCRIPT =' ASDADASD ASDA DSADAD AD AS D......' +@VAR1+ ' AWDAWd' -- 6000 CHARS PRINT LEN(@SCRIPT) --

我必须在SP中创建一个动态sql查询。动态查询是5000个字符,我使用了NVARCHAR(MAX)、VARCHAR(MAX)、NVARCHAR(6000)、VARCHAR(6000),但它们都截断为4000个字符

DECLARE @SCRIPT VARCHAR(8000)
set @SCRIPT =' ASDADASD ASDA  DSADAD AD AS D......' +@VAR1+ ' AWDAWd'    -- 6000 CHARS
PRINT LEN(@SCRIPT)      -- THIS PRINTS "4000"
PRINT @SCRIPT           -- THIS PRINTS ONLY 4000 CHARS
如何增加字符串的大小?我读过很多帖子,但都做不成。请帮助我?

请改用
nvarchar(max)
数据类型。 请确保使用N指示符(
N'asdadadasd…“
)作为字符串文本的前缀。明确强制转换,因此默认限制将不适用:

set @script=convert(nvarchar(max),N'very-long-literal')
(参考资料:)

编辑:完整工作示例:

DECLARE @SCRIPT nvarchar(max)
SET @SCRIPT=convert(nvarchar(max),N' ASDADASD ASDA  DSADAD AD AS D......')+replicate(convert(nvarchar(max),N'A'),6000)
PRINT LEN(@SCRIPT) -- this prints "6036"
PRINT @SCRIPT -- this prints all 6036 chars of the string
改用
nvarchar(max)
数据类型。 请确保使用N指示符(
N'asdadadasd…“
)作为字符串文本的前缀。明确强制转换,因此默认限制将不适用:

set @script=convert(nvarchar(max),N'very-long-literal')
(参考资料:)

编辑:完整工作示例:

DECLARE @SCRIPT nvarchar(max)
SET @SCRIPT=convert(nvarchar(max),N' ASDADASD ASDA  DSADAD AD AS D......')+replicate(convert(nvarchar(max),N'A'),6000)
PRINT LEN(@SCRIPT) -- this prints "6036"
PRINT @SCRIPT -- this prints all 6036 chars of the string
来自MSDN

可变长度、非Unicode字符串数据。n定义字符串长度,可以是1到8000之间的值。max表示最大存储大小为2^31-1字节(2 GB)。存储大小是输入的数据的实际长度+2字节。varchar的ISO同义词是char-varying或character-varying

因此,只需从MSDN中指定一个大小(max)

可变长度、非Unicode字符串数据。n定义字符串长度,可以是1到8000之间的值。max表示最大存储大小为2^31-1字节(2 GB)。存储大小是输入的数据的实际长度+2字节。varchar的ISO同义词是char-varying或character-varying

所以只需指定一个大小(max)

NVARCHAR(n)限制为4000,VARCHAR+NVARCHAR=NVARCHAR。看

DECLARE @SCRIPT VARCHAR(8000)
set @SCRIPT = replicate('A',6000)+'A'
select len(@SCRIPT) 

set @SCRIPT = replicate('A',6000)+N'A'
select len(@SCRIPT), 'mind NVARCHAR'
施放所有NVARCHAR(最大值)以确保

DECLARE @SCRIPT NVARCHAR(MAX) =replicate('A',7000)
set @SCRIPT = @SCRIPT +'A'
select len(@SCRIPT) 

set @SCRIPT = @SCRIPT + cast(replicate('A',6000) as NVARCHAR(MAX))
select len(@SCRIPT)
NVARCHAR(n)限制为4000,VARCHAR+NVARCHAR=NVARCHAR。看

DECLARE @SCRIPT VARCHAR(8000)
set @SCRIPT = replicate('A',6000)+'A'
select len(@SCRIPT) 

set @SCRIPT = replicate('A',6000)+N'A'
select len(@SCRIPT), 'mind NVARCHAR'
施放所有NVARCHAR(最大值)以确保

DECLARE @SCRIPT NVARCHAR(MAX) =replicate('A',7000)
set @SCRIPT = @SCRIPT +'A'
select len(@SCRIPT) 

set @SCRIPT = @SCRIPT + cast(replicate('A',6000) as NVARCHAR(MAX))
select len(@SCRIPT)

您好,第一个看起来可以工作,但当我将脚本设置为@script时。它再次截断到4000个。你的例子行得通,但我的不行。我忘了提到在NVARCHAR中间有变量。这会引起问题吗?我在上面编辑了我的代码,第一个看起来像是在工作,但当我将脚本设置为@script时。它再次截断到4000个。你的例子行得通,但我的不行。我忘了提到在NVARCHAR中间有变量。这会引起问题吗?我编辑了我的代码above@ayilmaz我用完整的工作代码示例更新了我的答案。您使用的是哪个版本的SQL server?我的成功测试是在10.50.1617上完成的。但是在replicate函数中,我应该给出什么来代替“a”
replicate
只是示例中的一个填充词。只需使用实际的全长脚本字符串,并省略
replicate
部分。您的示例有效,但我的示例无效。我忘了提到在NVARCHAR中间有变量。这会引起问题吗?我在上面编辑了我的代码,并对连接的部分进行了转换:
+convert(nvarchar(max),@VAR1)+…
(另外,请注意,确保此类@VAR1参数仅包含转义文字或根本不包含用户生成的数据,以防止SQL注入攻击漏洞)@ayilmaz I使用完整的工作代码示例更新了我的答案。您使用的是哪个版本的SQL server?我的成功测试是在10.50.1617上完成的。但是在replicate函数中,我应该给出什么来代替“a”
replicate
只是示例中的一个填充词。只需使用实际的全长脚本字符串,并省略
replicate
部分。您的示例有效,但我的示例无效。我忘了提到在NVARCHAR中间有变量。这会引起问题吗?我在上面编辑了我的代码,并对连接的部分进行了转换:
+convert(nvarchar(max),@VAR1)+…
(另外,请注意,确保此类@VAR1参数仅包含转义文本或根本不包含用户生成的数据,以防止SQL注入攻击漏洞)我怀疑您的问题的关键在于它不是纯6000个字符的文本,但实际上,您是从多个单独的文本构建它的,并且不符合以下要求:“如果字符串串联的结果超过8000字节的限制,则结果将被截断。但是,如果至少有一个串联的字符串是大值类型,则不会发生截断。”我怀疑你的问题的关键在于,它不是一个纯6000个字符的文字,而是由多个单独的文字组成,并与以下内容相冲突:如果字符串串联的结果超过8000字节的限制,则结果将被截断。但是,如果连接的字符串中至少有一个是大值类型,则不会发生截断。”