亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

SQL NVARCHAR和VARCHAR限制

SQL NVARCHAR和VARCHAR限制

江戶川亂折騰 2019-08-06 16:55:28
SQL NVARCHAR和VARCHAR限制總之,我有一個很大的(不可避免的)動態SQL查詢。由于選擇標準中的字段數,包含動態SQL的字符串增長超過4000個字符?,F在,我知道有一個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 關注
  • 1068 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號