我有一个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的原始代码。
我希望我已经正确地解释了自己。任何帮助表示赞赏。
答案 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新版本的建议 但是因为我发现导致问题的细节我不需要这样做。