SQL NVARCHAR和VARCHAR限制

SQL NVARCHAR和VARCHAR限制

总之,我有一个很大的(不可避免的)动态SQL查询。由于选择标准中的字段数,包含动态SQL的字符串增长超过4000个字符。现在,我知道有一个4000最大值设置NVARCHAR(MAX),但查看Server Profiler中执行的SQL语句

DELARE @SQL NVARCHAR(MAX);SET @SQL = 'SomeMassiveString > 4000 chars...';EXEC(@SQL);GO

似乎工作(!?),对于另一个同样大的查询,它会抛出一个与此4000限制(!?)相关的错误,它基本上修剪了这个4000限制之后的所有SQL并且给我留下了语法错误。尽管这样的探查,它表示在这个动态的SQL查询(!?)。

究竟发生了什么,我应该将这个@SQL变量转换为VARCHAR并继续使用它吗?

谢谢你的时间。

PS。能够打印超过4000个字符来查看这些大查询也是很好的。以下限制为4000

SELECT CONVERT(XML, @SQL);PRINT(@SQL);

还有其他很酷的方式吗?


江户川乱折腾
浏览 1016回答 3
3回答

POPMUISE

好的,所以如果以后的问题是你有一个大于允许大小的查询(如果它继续增长可能会发生),你将不得不将其分成块并执行字符串值。所以,假设你有一个如下存储过程:CREATE PROCEDURE ExecuteMyHugeQuery    @SQL VARCHAR(MAX) -- 2GB size limit as stated by Martin SmithASBEGIN     -- Now, if the length is greater than some arbitrary value     -- Let's say 2000 for this example     -- Let's chunk it     -- Let's also assume we won't allow anything larger than 8000 total     DECLARE @len INT    SELECT @len = LEN(@SQL)     IF (@len > 8000)     BEGIN         RAISERROR ('The query cannot be larger than 8000 characters total.',                    16,                    1);     END     -- Let's declare our possible chunks     DECLARE @Chunk1 VARCHAR(2000),             @Chunk2 VARCHAR(2000),             @Chunk3 VARCHAR(2000),             @Chunk4 VARCHAR(2000)     SELECT @Chunk1 = '',            @Chunk2 = '',            @Chunk3 = '',            @Chunk4 = ''     IF (@len > 2000)     BEGIN         -- Let's set the right chunks         -- We already know we need two chunks so let's set the first         SELECT @Chunk1 = SUBSTRING(@SQL, 1, 2000)         -- Let's see if we need three chunks         IF (@len > 4000)         BEGIN             SELECT @Chunk2 = SUBSTRING(@SQL, 2001, 2000)             -- Let's see if we need four chunks             IF (@len > 6000)             BEGIN                 SELECT @Chunk3 = SUBSTRING(@SQL, 4001, 2000)                 SELECT @Chunk4 = SUBSTRING(@SQL, 6001, (@len - 6001))             END               ELSE             BEGIN                 SELECT @Chunk3 = SUBSTRING(@SQL, 4001, (@len - 4001))             END         END           ELSE         BEGIN             SELECT @Chunk2 = SUBSTRING(@SQL, 2001, (@len - 2001))         END     END     -- Alright, now that we've broken it down, let's execute it     EXEC (@Chunk1 + @Chunk2 + @Chunk3 + @Chunk4)END

蝴蝶不菲

你也可以使用nvarchar文本。这意味着你必须在你的大量字符串之前只有一个“N”,就是这样!没有限制了DELARE @SQL NVARCHAR(MAX);SET @SQL = N'SomeMassiveString > 4000 chars...';EXEC(@SQL);GO
打开App,查看更多内容
随时随地看视频慕课网APP