在使用ADODB命令在VB.net应用程序中动态生成存储过程后,我使用SP_HELPTEXT插入了额外的回车符

时间:2016-12-26 20:30:48

标签: vb.net dynamically-generated

我有一个VB.net应用程序,它获取从文件创建SP的代码,然后使用ADODB.command对象的execute方法执行它以创建SP:

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选项,我会得到以下内容:

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 

插入额外的回车或回车。第一行之后:

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的代码,以便使用它来创建另一个DB中的SP。这比在对象资源管理器中找到SP更容易。

另一件事是,如果我直接在SQL Server Management Studio中创建运行原始代码的SP,然后我使用SP_HELPTEXT,我会得到没有CR的代码。所以我认为问题出在VB.Net应用程序中

我发现的唯一模式是每个26X字符更少或更少。

此外,在debbuging我发现如果我停止在ADODB命令的.Execute方法中执行并且我检查CommandText的值,它的值包含没有CR的原始代码。

我希望我已经正确地解释了自己。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

感谢您的回答。 回复较晚,抱歉。我已经解决了这个问题。 是的,它与行终止符的类型有关。在VB应用程序中,包含由ADODB.Command执行的变量mStrSql的文本在该点之前在应用程序中进行了大量操作,因此在执行此文本操作后,我找到了这一行:

mStrSql = mStrSql.Replace(vbCrLf, vbCr)

因此文本的所有行终止符vbCrLf都被vbCr替换。 执行命令并创建SP后,使用SP_HELPTEXT和"结果文本"向我展示了我可以看到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 here新版本的建议 但是因为我发现导致问题的细节我不需要这样做。