繁体   English   中英

尝试通过VB.NET上的ExecuteNonQuery执行SQL Server脚本文件时出错

[英]Error trying to execute SQL Server script file via ExecuteNonQuery on VB.NET

该脚本在SQL Management Studio上效果很好,但在程序上却没有。 脚本文件检查某些存储过程是否存在,如果存在,则将其删除,然后再次声明它们,如下所示:

IF EXISTS(SELECT * FROM sys.objects WHERE type='P' AND name = 'myProc1')
  DROP PROCEDURE myProc1
GO
CREATE PROCEDURE myProc1
AS
BEGIN
  SELECT 
    [Field1] = ((*Some numeric value*)-(*Some numeric value*)),
    [Field2] = ((*Some numeric value*)-(*Some numeric value*)),
    [Field3] = ((*Some numeric value*)-(*Some numeric value*))
  FROM ...
  WHERE ...
END
GO

IF EXISTS(SELECT * FROM sys.objects WHERE type='P' AND name = 'myProc2')
  DROP PROCEDURE myProc2
GO
CREATE PROCEDURE myProc2
AS
BEGIN
  SELECT * FROM Table2
END
GO

IF EXISTS(SELECT * FROM sys.objects WHERE type='P' AND name = 'myProc3')
  DROP PROCEDURE myProc3
GO
CREATE PROCEDURE myProc3
AS
BEGIN
  SELECT * FROM Table3
END
GO

当我尝试在VB.NET上运行它时,我尝试了以下操作:

sql.CommandText = File.OpenText("C:\test.sql").ReadToEnd()
sql.CommandType = CommandType.Text
sql.Connection = connects.con
sql.ExecuteNonQuery()

我得到这个错误:

Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
Incorrect syntax near ')'.
Incorrect syntax near '-'.
Incorrect syntax near ')'.
Incorrect syntax near '-'.
Incorrect syntax near ')'.
Incorrect syntax near '-'.
Incorrect syntax near '�'.

因此,至少有3个GO,3个操作,甚至还有一些未知字符。

关于我在做什么错的任何想法吗?

我知道这是一个古老的工具,但是我做了很多,为了解决这个问题,我为SQL Management Studio的存储过程生成了脚本,在高级情况下,我告诉它“检查对象是否存在” SQL 2010+(2010年前是check对象存在或类似对象),并将“脚本删除和创建”设置为“脚本删除和创建”。

然后从脚本中取出“ GO”(我通常用匹配大小写的空格替换所有GO或一键式替换一次,所以我知道这是正确的GO替换了),它将完美运行在VB.NET/t-SQL中。

这意味着它将生成如下脚本:

/****** Object:  StoredProcedure [dbo].[test3]    Script Date: 11/03/2015 16:47:48 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test3]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[test3]

/****** Object:  StoredProcedure [dbo].[test2]    Script Date: 11/03/2015 16:47:48 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test2]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[test2]

/****** Object:  StoredProcedure [dbo].[test1]    Script Date: 11/03/2015 16:47:48 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test1]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[test1]

/****** Object:  StoredProcedure [dbo].[test1]    Script Date: 11/03/2015 16:47:48 ******/
SET ANSI_NULLS ON

SET QUOTED_IDENTIFIER ON

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test1]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[test1]

AS
BEGIN
    print ''dummy procedure 1''
END
' 
END

/****** Object:  StoredProcedure [dbo].[test2]    Script Date: 11/03/2015 16:47:48 ******/
SET ANSI_NULLS ON

SET QUOTED_IDENTIFIER ON

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test2]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[test2]

AS
BEGIN
    print ''dummy procedure 2''
END
' 
END

/****** Object:  StoredProcedure [dbo].[test3]    Script Date: 11/03/2015 16:47:48 ******/
SET ANSI_NULLS ON

SET QUOTED_IDENTIFIER ON

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test3]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[test3]

AS
BEGIN
    print ''dummy procedure 3''
END
' 
END

我大约5年前开始这样做,从没遇到任何问题

希望这对人们有帮助

问候

利亚姆

GO命令是SMSS的批处理分隔符 ,不是T-SQL命令的一部分。 然后,您的脚本将在SSMS工作,因为它将执行每个批处理。 另一方面, .Net Framework将脚本传递给底层SQL引擎,并将其视为一个大脚本,而不是应分开的批处理,因此存在错误。

因此,在一个命令中创建三个存储过程将不起作用。

我的建议是您在后端分别创建脚本,然后test.sql应该如下所示:

  EXEC myProc1
  EXEC myProc2
  EXEC myProc3

但是,如果你想在飞行创建三个存储过程,那么你可能只是分隔每个CREATE PROCEDURE分为三个不同的SQL文本文件,即test1.sqltest2.sqltest3.sqlmyProc1myProc2myProc3分别。

暂无
暂无

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

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