Переменная хранимой процедуры, определенная как nvarchar(max), усекается до 4000 символов.

Когда я печатаю параметр @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

person e4rthdog    schedule 09.01.2015    source источник
comment
проверьте этот ответ: stackoverflow.com/questions/4833549/   -  person Pranay Rana    schedule 09.01.2015
comment
Итак, я должен заменить print на select и, возможно, добавить char (13) после char (10)?   -  person e4rthdog    schedule 09.01.2015
comment
Один из вариантов использования XML, который я видел (может быть, не для вашего запроса, а просто хочу поделиться): select @SQL as [processing-instruction(x)] FOR XML PATH   -  person Darka    schedule 09.01.2015


Ответы (3)


он усекается печатью - «Типы данных varchar (max) и nvarchar (max) усекаются до типов данных, которые не больше, чем varchar (8000) и nvarchar (4000)».

person fly_ua    schedule 09.01.2015

Вы правы, когда мы получаем данные в 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) все еще усекается

person Ajay2707    schedule 09.01.2015

В моем случае я хотел иметь возможность скопировать результаты sp, поэтому решение:

1) Заменить print на select 2) Добавить char(13) после char(10)

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
person e4rthdog    schedule 09.01.2015