【问题标题】:Stored procedure variable defined nvarchar(max) gets truncated to 4000 chars定义的存储过程变量 nvarchar(max) 被截断为 4000 个字符
【发布时间】:2015-03-07 12:05:31
【问题描述】:

当我打印 @v_sql 参数时,我得到 4000 个字符。

我该如何解决这个问题?

来源:

BEGIN
    SET NOCOUNT ON;
    DECLARE @v_sql nvarchar(max)
    SELECT @v_sql = N'';
    IF UPPER(@action)='DISABLE'
    BEGIN
        SELECT @v_sql = @v_sql + 'ALTER INDEX '+ QUOTENAME(name,'[')+' ON ' + quotename( OBJECT_SCHEMA_NAME(object_id),'[') +'.'+ quotename( OBJECT_NAME(object_id),'[') + ' DISABLE;'+char(10)
        FROM sys.indexes
        WHERE OBJECTPROPERTY([object_id], 'IsMsShipped') = 0 AND type =2;   
    END
    IF UPPER(@action)='REBUILD'
    BEGIN
        SELECT @v_sql = @v_sql + 'ALTER INDEX '+QUOTENAME(name,'[')+' ON ' +  quotename( OBJECT_SCHEMA_NAME(object_id),'[') +'.'+ quotename( OBJECT_NAME(object_id),'[') + ' REBUILD WITH(SORT_IN_TEMPDB=ON);'+char(10)
        FROM sys.indexes
        WHERE OBJECTPROPERTY([object_id], 'IsMsShipped') = 0 AND type =2;
    END
    IF @v_sql <> ''
    BEGIN
        print @v_sql
        --EXEC sp_executesql @v_sql;
    END
END

【问题讨论】:

  • 所以我应该用 select 替换 print 并且可能在 char(10) 之后添加一个 char(13)?
  • 我看到的使用 XML 的选项之一(可能不是为了您的查询,但只是想分享):select @SQL as [processing-instruction(x)] FOR XML PATH

标签: sql-server tsql sqldatatypes nvarchar


【解决方案1】:

它被 print 截断 - “varchar(max) 和 nvarchar(max) 数据类型被截断为不大于 varchar(8000) 和 nvarchar(4000) 的数据类型。”

【讨论】:

    【解决方案2】:

    就我而言,我希望能够复制粘贴 sp 的结果,因此解决方案是:

    1) 用选择替换打印 2) 在char(10)之后添加char(13)

    BEGIN
        SET NOCOUNT ON;
        DECLARE @v_sql nvarchar(max)
        SELECT @v_sql = N'';
        IF UPPER(@action)='DISABLE'
        BEGIN
            SELECT @v_sql = @v_sql + 'ALTER INDEX '+ QUOTENAME(name,'[')+' ON ' + quotename( OBJECT_SCHEMA_NAME(object_id),'[') +'.'+ quotename( OBJECT_NAME(object_id),'[') + ' DISABLE;'+char(10) + char(13)
            FROM sys.indexes
            WHERE OBJECTPROPERTY([object_id], 'IsMsShipped') = 0 AND type =2;   
        END
        IF UPPER(@action)='REBUILD'
        BEGIN
            SELECT @v_sql = @v_sql + 'ALTER INDEX '+QUOTENAME(name,'[')+' ON ' +  quotename( OBJECT_SCHEMA_NAME(object_id),'[') +'.'+ quotename( OBJECT_NAME(object_id),'[') + ' REBUILD WITH(SORT_IN_TEMPDB=ON);'+char(10) + char(13)
            FROM sys.indexes
            WHERE OBJECTPROPERTY([object_id], 'IsMsShipped') = 0 AND type =2;
        END
        IF @v_sql <> ''
        BEGIN
            select @v_sql
            --EXEC sp_executesql @v_sql;
        END
    END
    

    【讨论】:

      【解决方案3】:

      你说得对,当我们得到PRINT中的数据时,它会被截断,但实际执行数据时不会被截断,唯一的事情是我们必须将长度定义为MAX。

      Sqlserver 也支持 8000 个字符。只有东西,你看不到,但它会被sqlserver执行。

      表示EXEC sp_executesql @v_sql; 将执行 sqlserver 附加尽可能多的长字符串。并执行。

      我认为你得到了一个错误,我们需要打印实际的查询。是的,如果是,那么我有一个解决方案,例如,您可以破坏独立执行或工作的代码。

      您可以使用结果集中的核心值,检查是否会产生问题,然后删除/添加一些过滤更多数据的条件。

      你终于得到了产生问题的数据。

      只运行这部分,然后运行第二部分。

      DECLARE @v_sql nvarchar(max)
          SELECT @v_sql = N'';
          IF UPPER(@action)='DISABLE'
          BEGIN
              SELECT @v_sql = @v_sql + 'ALTER INDEX '+ QUOTENAME(name,'[')+' ON ' + quotename( OBJECT_SCHEMA_NAME(object_id),'[') +'.'+ quotename( OBJECT_NAME(object_id),'[') + ' DISABLE;'+char(10) + char(13)
              FROM sys.indexes
              WHERE OBJECTPROPERTY([object_id], 'IsMsShipped') = 0 AND type =2;   
          END
          IF @v_sql <> ''
             BEGIN
               select @v_sql
               --EXEC sp_executesql @v_sql;
             END
      

      nvarchar(max) still being truncated

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-07
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-08
        • 1970-01-01
        相关资源
        最近更新 更多