[英]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.sql
, test2.sql
和test3.sql
为myProc1
, myProc2
和myProc3
分别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.