简体   繁体   English

存储过程变量定义的nvarchar(max)被截断为4000个字符

[英]Stored procedure variable defined nvarchar(max) gets truncated to 4000 chars

When i print the @v_sql parameter i get 4000 chars. 当我打印@v_sql参数时,我得到4000个字符。

How i fix this? 我该如何解决?

Source: 资源:

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

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

You are right, when we get the data in PRINT it is truncated, but it will not truncated when actual data executed, the only thing is we have to define length as MAX. 没错,当我们在PRINT获取数据时,它会被截断,但是在实际数据执行时它不会被截断,唯一的事情就是我们必须将长度定义为MAX。

Sqlserver support 8000 charcter also. Sqlserver也支持8000个字符。 Only thing , you can't see, but it will executed by sqlserver. 唯一的事情,您看不到,但是它将由sqlserver执行。

Means EXEC sp_executesql @v_sql; 表示EXEC sp_executesql @v_sql; will execute sqlserver append as many long string. 将执行sqlserver附加尽可能多的长字符串。 and executed. 并执行。

I think you get an error, at that we need to print actual query. 我认为您遇到了一个错误,因为我们需要打印实际的查询。 Right, if yes, then I have one solution like, you can break your code which is independently execute or work. 是的,如果可以,那么我有一个解决方案,您可以破坏独立执行或工作的代码。

You can use hardcore value from one the resultset, check that will create an issue, then remove/add some condition which filter the more data. 您可以从结果集中使用一个核心值,检查是否会产生问题,然后删除/添加一些条件以过滤更多数据。

Finally you got the data which create an issue. 最后,您获得了造成问题的数据。

Run only this portion and then second portion. 仅运行此部分,然后运行第二部分。

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 nvarchar(max)仍被截断

In my case i wanted to be able to copy paste the results of the sp so the solution is: 就我而言,我希望能够复制并粘贴sp的结果,因此解决方案是:

1) Replace print with select 2) Add char(13) after char(10) 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM