go 动态创建mysql表_Sql语句不能识别Go的解决办法(动态创建表的触发器)

在Go中动态创建MySQL表时遇到SQL语句执行问题,主要原因是`GO`命令在SqlCommand中不被识别。解决方法包括:1. 将创建触发器的SQL作为字符串执行;2. 使用存储过程执行;3. 分别执行每个创建SQL。文中提供了相应的C#代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题来源

用sqlserver直接打开sql文本,执行没问题,但是当用Sqlcommand类执行cmdtext命令文本时总是失败报错。

原因分析及解决

用数据库直接执行sql语句没问题,甚至还可以用Go来进行分批处理,但是当你用链接类访问数据库,并执行sql语句时就有些限制,如下:

System.Data.SqlClient.SqlCommand cmd;try{using (System.Data.SqlClient.SqlConnection newconn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=Rfa_LPP3;Integrated Security=True"))

{

cmd= new System.Data.SqlClient.SqlCommand("Create trigger triggerName on dbo.tableName for insert as begin declare @ID int; select @ID=ID from inserted; print @ID end", conn);

cmd.ExecuteNonQuery();

cmd.Dispose();

}

}

cath(Exception ex)

{throw;//会抛出异常

}

会“go附近有语法错误”“'CREATE TRIGGER' 必须是查询批次中的第一个语句”等错误

首先来看下GO的用法:

SQL Server 实用工具将 GO 解释为应将当前的 Transact-SQL 批处理语句发送给 SQL Server 的信号。SQL Server 应用程序可将多条 Transact-SQL 语句作为一个批处理发给 SQL Server 去执行。在此批处理中的语句编译成一个执行计划。程序员在 SQL Server 实用工具中执行特定语句,或生成 Transact-SQL 语句脚本在 SQL Server 实用工具中运行,用 GO 来标识批处理的结束

注意:1.GO 命令和Transact-SQL 语句不可在同一行上。但在 GO 命令行中可包含注释。2.CREATE DEFAULT、CREATE PROCEDURE、CREATE RULE、CREATE TRIGGER 和 CREATE VIEW 语句不能在批处理中与其它语句组合使用。批处理必须以 CREATE 语句开始。所有跟在该批处理后的其它语句将被解释为第一个 CREATE 语句定义的一部分

再来看看SqlCommand类的解释:表示要对 SQL Server 数据库执行的一个 Transact-SQL 语句或存储过程。所以用SqlCommand去执行的文本内容可以是多条sql语句,或者是一个存储过程,或者触发器创建等,但是不能与触发器创建等组合使用,且不能使用Go批结束命令。

但是,我又想在一个mySql.sql文本中一起执行,该怎么办呢?

提供三种思路:

1.将创建触发器的sql当字符串放到变量里面,然后exec执行变量。

2.将创建触发器的sql放在存储过程,然后exec存储过程执行。

3.将创建触发器的sql单独执行一次。每个创建的sql单独取出来执行。

最后贴上代码.

1.方法1可执行的sql

USE [LPP12]

declare @sql nvarchar(max);set @sql='Create trigger triggerName on dbo.tableName for insert as begin declare @ID int; select @ID=ID from inserted; print @ID end';

exec(@sql);

2.方法2的sql

create procedure proc_nameasbegin

declare @sql nvarchar(max);set @sql='Create trigger triggerName on dbo.tableName for insert as begin declare @ID int; select @ID=ID from inserted; print @ID end';

exec(@sql);

end

3.方法3:将sql存放在xml里面,每次取出执行一次。

//xml内容

name="trigger_insert"value="Create trigger trigger_name

on dbo.tablenameforinsertasbegin

declare @IDint;select @ID=ID frominserted;

end">

//c#代码

System.Data.SqlClient.SqlCommand cmdnew;try{string _XmlPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\SqlCreateTrggers.xml";

XmlDocument doc= newXmlDocument();

doc.Load(_XmlPath);

XmlNodeList nodes= doc.SelectSingleNode("TR").ChildNodes;using (System.Data.SqlClient.SqlConnection newconn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=Rfa_LPP3;Integrated Security=True"))

{

newconn.Open();

cmdnew= newSystem.Data.SqlClient.SqlCommand();foreach (XmlElement node innodes)

{string value = node.Attributes["value"].Value;

cmdnew= new System.Data.SqlClient.SqlCommand(value.Replace("\r", " ").Replace("\n", " ").Replace("\t", " "), newconn);int count =cmdnew.ExecuteNonQuery();

}

cmdnew.Dispose();

newconn.Close();

}

}catch(Exception ex)

{

Console.WriteLine(ex.Message);

Console.ReadKey();

}

有错欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值