为了账号安全,请及时绑定邮箱和手机立即绑定

SQL NVARCHAR和VARCHAR限制

SQL NVARCHAR和VARCHAR限制

江户川乱折腾 2019-08-06 16:55:28
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个字符来查看这些大查询也是很好的。以下限制为4000SELECT CONVERT(XML, @SQL);PRINT(@SQL);还有其他很酷的方式吗?
查看完整描述

3 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

好的,所以如果以后的问题是你有一个大于允许大小的查询(如果它继续增长可能会发生),你将不得不将其分成块并执行字符串值。所以,假设你有一个如下存储过程:

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


查看完整回答
反对 回复 2019-08-06
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

你也可以使用nvarchar文本。这意味着你必须在你的大量字符串之前只有一个“N”,就是这样!没有限制了

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


查看完整回答
反对 回复 2019-08-06
  • 3 回答
  • 0 关注
  • 1015 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信