У меня есть дополнительный возврат каретки, вставленный с помощью SP_HELPTEXT после создания хранимых процедур динамически в A VB.net приложение с командой ADODB

У меня есть VB.net приложение, которое получает код для создания SP из файла, а затем выполняет его для создания SP, используя метод execute ADODB.объект команды:

mcmd = New ADODB.Command
With mcmd
    .CommandType = ADODB.CommandTypeEnum.adCmdText
    .let_ActiveConnection(mcnn)
    .CommandText = mStrSql
    .Parameters.Refresh()
    .CommandTimeout = 0
    .Execute(lngMVV, , ADODB.ExecuteOptionEnum.adExecuteNoRecords)
End With 

SP создан, но вот ситуация.

Это оригинальный SP:

CREATE PROCEDURE [dbo].[spPrueba06] 
(
    @idcvedef int OUTPUT  ,  
    @anio smallint OUTPUT    
)    
AS 
BEGIN 
/* 
    Nombre Objeto   : [dbo].[spPrueba06] 
    Versión         : 001 
    Usuario Creación: ALBERTO VAZQUES GUTIERREZ
    Fecha Creación  : 14/01/2016 
    Módulo          :  
    Reportes        : NA 
    Requerimientos  :  
    Descripción     : SP de lectura de row de la tabla ClaveEjercicio 
*/
/*      
    -->>Modificación: 001JGB20160114 Creación del SP  
*/ 
SET NOCOUNT ON 
SELECT  
    @idcvedef = COALESCE(idcvedef,'') ,  
    @anio = COALESCE(anio,'')   

    FROM PppCveDef 
    WHERE  
    anio = @anio 
OPTION(OPTIMIZE FOR UNKNOWN) 
SET NOCOUNT OFF 
END  

И после запуска приложения, если я использую SP_HELPTEXT с включенной опцией SQL Server» Results to text», я получу следующее:

CREATE PROCEDURE dbo.spPrueba06 
(
    @idcvedef int OUTPUT  ,  
    @anio smallint OUTPUT    
)    
AS 
BEGIN 
/* 
    Nombre Objeto   : [dbo].[spPrueba06] 
    Versión         : 001 
    Usuario Creación: ALBERTO VAZQUES GUTIERREZ
    Fecha Creación  : 14/01/201
6 
    Módulo          :  
    Reportes        : NA 
    Requerimientos  :  
    Descripción     : SP de lectura de row de la tabla ClaveEjercicio 
*/
/*      
    -->>Modificación: 001JGB20160114 Creación del SP  
*/ 
SET NOCOUNT ON 
SELECT  
    @idcvedef = COALESCE(idcvede
f,'') ,  
    @anio = COALESCE(anio,'')   

    FROM PppCveDef 
    WHERE  
    anio = @anio 
OPTION(OPTIMIZE FOR UNKNOWN) 
SET NOCOUNT OFF 
END 

Таким образом, дополнительный возврат каретки или Enter вставляются. Первый после строки:

Fecha Creación  : 14/01/201

а потом после линии:

@idcvedef = COALESCE(idcvede

Если я найду SP в обозревателе объектов и щелкну Правой Кнопкой Мыши-изменить, я получу код без CR:

USE [DBSIIF_AGS_MODELO_2016_12_22]
GO
/****** Object:  StoredProcedure [dbo].[spPrueba06]    Script Date: 26/12/2016 05:40:17 p. m. ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[spPrueba06] 
(
    @idcvedef int OUTPUT  ,  
    @anio smallint OUTPUT    
)    
AS 
BEGIN 
/* 
    Nombre Objeto   : [dbo].[spPrueba06] 
    Versión         : 001 
    Usuario Creación: ALBERTO VAZQUES GUTIERREZ
    Fecha Creación  : 14/01/2016 
    Módulo          :  
    Reportes        : NA 
    Requerimientos  :  
    Descripción     : SP de lectura de row de la tabla ClaveEjercicio 
*/
/*      
    -->>Modificación: 001JGB20160114 Creación del SP  
*/ 
SET NOCOUNT ON 
SELECT  
    @idcvedef = COALESCE(idcvedef,'') ,  
    @anio = COALESCE(anio,'')   

    FROM PppCveDef 
    WHERE  
    anio = @anio 
OPTION(OPTIMIZE FOR UNKNOWN) 
SET NOCOUNT OFF 
END 

Таким образом, проблема возникает только с SP_HELPTEXT. Здесь это важно, потому что мы используем много SP и много раз есть необходимость найти код определенного SP для того, чтобы использовать его для создания SP в другой БД, например. И это проще, чем найти SP в обозревателе объектов.

Другое дело, что если я создаю SP, выполняющий исходный код непосредственно в SQL Server Management Studio, а затем я использую SP_HELPTEXT, я получаю код без CR. Поэтому я предполагаю, что проблема в VB.Net app

Единственный шаблон, который я нашел, это то, что происходит каждые 26X символов больше или меньше.

Кроме того, во время debbuging я узнал, что если я остановлю исполнение в .Выполните метод команды ADODB и я проверяю значение CommandText, его значение содержит исходный код без CR.

Надеюсь, я все правильно объяснил. Любая помощь ценится.

1 ответ

  1. Спасибо за ответы.
    Извините за задержанный ответ. Я уже решил проблему.
    Да, это было связано с типом линии-терминатора. В приложении VB текст, содержащий переменную mStrSql, которая выполняется ADODB.Команда, манипулируется много в приложении до этого момента, так что после этого текста манипуляции я нашел эту строку:

    mStrSql = mStrSql.Replace(vbCrLf, vbCr)
    

    Таким образом, все Терминаторы строк vbcrlf текста были заменены vbCr.
    После выполнения команды и создания SP, используя SP_HELPTEXT с «Results to text» показал мне текст, в котором я мог видеть CR как новую строку, но то, что, кажется, происходит здесь, что внутренне sp_helptext не принимает CR как конец строки, и поскольку он определяет максимальную длину строки как 255, когда эта длина достигается в тексте, он вставляет новую строку в таблицу результатов.
    Код SP_HELPTEXT имеет следующий комментарий:

    ** lengths on @Line, #CommentText Text column and
    ** value for @DefinedLength are all 255. These need to all have
    ** the same values. 255 was selected in order for the max length
    ** display using down level clients
    */
    

    и ниже в коде есть следующая строка:

    select @CurrentPos =   CHARINDEX(char(13)+char(10), @SyscomText, @BasePos)
    

    который ищет строку-Терминатор как char (13)+char(10) (LFCR), если он находит его, новая строка, содержащая текст, пока эта точка не будет вставлена, если нет, новая строка, содержащая текст с длиной 255 вставляется в таблицу результатов.

    Таким образом, проблема заключалась в неправильной линии-Терминаторе CR. Я также нашел предложение о создании новой версии sp_helptext здесь
    Но так как я нашел деталь, которая вызвала проблему, мне не нужно было делать это.