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

问题来源

用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_name
as
begin
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内容
<?xml version="1.0" encoding="utf-8" ?>
<TR>
  <add name="trigger_insert" value="trigger_familyContent_insert"
    value="Create trigger trigger_name
on dbo.tablename
for insert
as
begin
declare @ID int;
select @ID=ID from inserted;
end"></add>
  <add
    name="trigger_insert"
    value="Create trigger trigger_name
on dbo.tablename
for insert
as
begin
declare @ID int;
select @ID=ID from inserted;
end"></add>

</TR>
//c#代码
 System.Data.SqlClient.SqlCommand cmdnew;
                        try
                        {
                            string _XmlPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\SqlCreateTrggers.xml";
                            XmlDocument doc = new XmlDocument();
                            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 = new System.Data.SqlClient.SqlCommand();
                                foreach (XmlElement node in nodes)
                                {
                                    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();
                        }

有错欢迎指正。

Sql语句不能识别Go的解决办法(动态创建表的触发器),布布扣,bubuko.com

时间: 2024-08-05 02:37:13

Sql语句不能识别Go的解决办法(动态创建表的触发器)的相关文章

PDF复制SQL语句没有换行符的解决办法

PDF中的 plsql developer中 解决方法:使用Google Chrome打开在复制就解决了 原文地址:https://www.cnblogs.com/ooo888ooo/p/12597744.html

安装SQL Server2008,要重启机器,解决办法

安装SQL Server2008时,总提示有挂起,要重启机器:重启之后还是有相应的提示,该怎么办呢? 其实只要删除一个注册表项就可以了: 1.  打开注册表编辑器 开始菜单—>运行->regedit 2. 删除注册表项 PendingFileRenameOperations -HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager 找到PendingFileRenameOperations项并将其删除. 问题解决了

SQL Server死锁产生原因及解决办法

SQL Server死锁产生原因及解决办法 2006-07-18 05:12:10 分类: SQL Server 其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B,另一个用户B 访问表B(锁住了表B),然后企图访问表A,这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了,同样用户B要等用户A释放表A才能继续这就死锁了. 解决方法: 这种死锁是由于你的程序的BUG产生的,除了调整你的程序

教你在mac上配置adb环境变量!!附上adb无法识别M2的解决办法

[经验技巧] 教你在mac上配置adb环境变量!!附上adb无法识别M2的解决办法 楼主表于 2012-11-13 15:47:26 最近小编突然换了mac做了主力机,作为一个习惯在Windows使用adb刷机和安装卸载软件的屌丝来说,突然不能使用adb简直就是痛不欲生啊.还好经过度娘的指点,我成功的配置了环境变量. 下面就跟大家简单说一下具体的一些步骤,其中我为了大家更容易理解,精简掉了一些无关紧要的步骤,该教程只限于配置使用adb命令刷机或者做一些简单操作的用户~ -------------

SQL数据库损坏的原因和解决办法

现在许多工作人员还在普遍使用SQL SEVER,由于种种原因,SQL数据库会出 现不同程度的损坏,非常影响员工的正常工作.数据的丢失还可能会给公司带 来巨大损失.本文额外大家介绍SQL数据库损坏的原因和解决办法. 当附加数据库文件MDF及日志文件LDF时,报“823”错误.故障出现原因: (1)在数据库读写过程中突然死机或者断电. (2)服务器重启,重启后数据库出现“置疑”状态. (3)磁盘I/O错误 在以上可能的三种突发故障下,由于缓冲数据丢失,数据库无法写入正确 的数据,导致数据结构紊乱,重

SQL Server 2008从基础开始学习历程(1)------创建表与查询

[by:yy] 无论我们学什么呢,都要讲究一个Why,一个How.那么我们为什么要学SQL呢?无非就那么几点. 1.为了适应其他技术,和其他技术配对而学. 我个人的理解呢,只要在IT行业,无论你学什么,或者做什么工作.都离不开数据库.而学习数据库呢,又太文字化了,看的心里就烦.我是很抵触文字的.看着一大排一大排的字,就怕.可能是大天朝的教育所致.已经怕了学生生涯了. 2.为了适应社会而学. 随便找个招聘信息,都会有标注需要会SQL语言啊.了解MySql呀.会搞Oracle呀.所以呢,为了能在找工

C#解决 动态创建库、动态创建表

在11月10号.我们开始着手做高校平台这个项目,这个项目里面,有很多的子系统.权限系统.基础系统.考试系统-- 既然是高校平台,当然不只是一个学校用的,可以很多的学校公用.既然如此,每个学校所要保存的数据当然不可能存放在一个库中.一个学校一个库,那么有几个学校用呢?未知.库的数量得视情况而定.动态创建库可以解决这种问题. 当然,系统有很多.但是个人只是参与子系统的开发.在之前一直在考试系统里面打杂.这个项目分配下来了之后,我也就开始由打杂换了一种方式去打杂. 在做项目的过程中,任务的分配是非常明

SQL Analysis Services MDX 查询超时 解决办法

当页面有很多MDX语句查询的时候,会发生超时的情况. 解决办法: SQL Analysis Services所在的服务器(OLAP的文件夹下) 找到: msmdpump.ini 将: <ConfigurationSettings> <ServerName>localhost</ServerName> <SessionTimeout>3600</SessionTimeout> <ConnectionPoolSize>100</Co

SQL SERVER 2014 缺少Business Intelligence 解决办法

SQL SERVER 2014安装完所有的数据库工具后,缺少开发工具 Business Intelligence   之解决办法. https://msdn.microsoft.com/en-us/library/bb522628(v=sql.120).aspx https://www.microsoft.com/zh-CN/download/details.aspx?id=36843   visual studio 2012