问题来源

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

原因分析及解决

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

  1. System.Data.SqlClient.SqlCommand cmd;
  2. try
  3. {
  4. using (System.Data.SqlClient.SqlConnection newconn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=Rfa_LPP3;Integrated Security=True"))
  5. {
  6. 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);
  7. cmd.ExecuteNonQuery();
  8. cmd.Dispose();
  9. }
  10. }
  11. cath(Exception ex)
  12. {
  13. throw;//会抛出异常
  14. }

会“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 语句定义的一部分

  1.  

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

  1.  

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

提供三种思路:

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

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

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

  1. 最后贴上代码.
  1. 1.方法1可执行的sql
  1. USE [LPP12]
  2. declare @sql nvarchar(max);
  3. set @sql='Create trigger triggerName on dbo.tableName for insert as begin declare @ID int; select @ID=ID from inserted; print @ID end';
  4. exec(@sql);

2.方法2的sql

  1. create procedure proc_name
  2. as
  3. begin
  4. declare @sql nvarchar(max);
  5. set @sql='Create trigger triggerName on dbo.tableName for insert as begin declare @ID int; select @ID=ID from inserted; print @ID end';
  6. exec(@sql);
  7. end

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

  1. //xml内容
  2. <?xml version="1.0" encoding="utf-8" ?>
  3. <TR>
  4. <add name="trigger_insert" value="trigger_familyContent_insert"
  5. value="Create trigger trigger_name
  6. on dbo.tablename
  7. for insert
  8. as
  9. begin
  10. declare @ID int;
  11. select @ID=ID from inserted;
  12. end"></add>
  13. <add
  14. name="trigger_insert"
  15. value="Create trigger trigger_name
  16. on dbo.tablename
  17. for insert
  18. as
  19. begin
  20. declare @ID int;
  21. select @ID=ID from inserted;
  22. end"></add>
  23.  
  24. </TR>
  25. //c#代码
  26. System.Data.SqlClient.SqlCommand cmdnew;
  27. try
  28. {
  29. string _XmlPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\SqlCreateTrggers.xml";
  30. XmlDocument doc = new XmlDocument();
  31. doc.Load(_XmlPath);
  32. XmlNodeList nodes = doc.SelectSingleNode("TR").ChildNodes;
  33.  
  34. using (System.Data.SqlClient.SqlConnection newconn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=Rfa_LPP3;Integrated Security=True"))
  35. {
  36. newconn.Open();
  37. cmdnew = new System.Data.SqlClient.SqlCommand();
  38. foreach (XmlElement node in nodes)
  39. {
  40. string value = node.Attributes["value"].Value;
  41. cmdnew = new System.Data.SqlClient.SqlCommand(value.Replace("\r", " ").Replace("\n", " ").Replace("\t", " "), newconn);
  42. int count = cmdnew.ExecuteNonQuery();
  43. }
  44. cmdnew.Dispose();
  45. newconn.Close();
  46. }
  47. }
  48. catch (Exception ex)
  49. {
  50. Console.WriteLine(ex.Message);
  51. Console.ReadKey();
  52. }

有错欢迎指正。

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

  1. SQL Server 2008 r2 输入SQL语句不能自动提示的解决办法

    先利用“配置工具-SQL Server 配置管理器”关闭所有MSSQLSERVER服务,利用SQL Server Installation Center,进入Maintenance,选择Repair, ...

  2. webdav不识别软链接?解决办法?

    webdav不识别软链接?解决办法? 在使用webdav实现公网存储共享的时候,发现webdav并不支持软链接的共享,如下源代码可以100%确定这个问题 /* ### for now, only pr ...

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

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

  4. This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de 错误解决办法

    这是我们开启了bin-log, 我们就必须指定我们的函数是否是1 DETERMINISTIC 不确定的2 NO SQL 没有SQl语句,当然也不会修改数据3 READS SQL DATA 只是读取数据 ...

  5. SQL SERVER 2014 缺少Business Intelligence 解决办法

    SQL SERVER 2014安装完所有的数据库工具后,缺少开发工具 Business Intelligence   之解决办法. https://msdn.microsoft.com/en-us/l ...

  6. SQL数据库对于保存特殊字符的解决办法

    数据库的Char.Vachar类型可以兼容汉字,但特殊字符不行,在保存包含有特殊字符的字符串.正文时,会将特殊符号替换成一个”?”号. 例如: “基础教育课程手机报•特刊” == > “基础教育 ...

  7. SQL Server 2008 错误 233 的解决办法

    问题一.忘记了登录Microsoft SQL Server 2008 的sa的登录密码 解决方法:先用windows身份验证的方式登录进去,然后在‘安全性’-‘登录’-右键单击‘sa’-‘属性’,修改 ...

  8. PHPcms v9 get标签sql 语句limit无效问题的解决方法

    get标签非常好用,自定义模型后get几乎变成万能的了.但是PHPCMS升级到V9后,把2008的很多功能都去掉了,比如get标签中,在后面自动添加了一个LIMIT 0,20,这样你即使写了num=' ...

  9. Mysql错误: ERROR 1205: Lock wait timeout exceeded解决办法(MySQL锁表、事物锁表的处理方法)

    Java执行一个SQL查询未提交,遇到1205错误. java.lang.Exception: ### Error updating database.  Cause: java.sql.SQLExc ...

随机推荐

  1. Winform 无边框随意拖动【转载】

    本篇技术内容转载自:http://www.cnblogs.com/ap0606122/archive/2012/10/23/2734964.html using System; using Syste ...

  2. hdu EXCEL排序

    Problem Description Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. Input 测试输入包含若干测试用例.每个测试用例的第1行包含两个整数 N (<= ...

  3. Fun with dynamicobject dynamic and the settings table

    What came before In my previous post I discussed ways of making the settings table using Generics to ...

  4. POJ3041 二分图最大匹配

    问题:POJ3041 分析: 构造二分图:令A = B = { 1, 2, ... , n }, 分别代表行号集与列号集.假如第i行第j列有一颗行星,则连接Ai与Bj, 表示必须从Ai(即第i行),B ...

  5. 基于zigbee与tiny4412开发板的环境监测系统

    一.开发板环境搭建 1.tiny4412   linux系统的布置 参考博客:http://www.cnblogs.com/luoxiang/p/4186391.html 二.boa服务器的搭建 下载 ...

  6. SVN上传代码时代码失败

    Description : You are not authorized to access the files in the repository.Suggestion : You might be ...

  7. [HDU] 2094 产生冠军(拓扑排序+map)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2094 注意每组数据处理前,map要清空. #include<cstdio> #includ ...

  8. 养成代码注释习惯,帮助你更好使用NetBeans导航器

    在使用NetBeans编写php代码时,为了在一个类中,或者在方法库文件中快速找到你想要找的函数或方法,通常我们会使用NetBeans的导航器. 我们看一个导航器的事例: 大家知道,在php中代码习惯 ...

  9. hdu 1811 Rank of Tetris

    http://acm.hdu.edu.cn/showproblem.php?pid=1811 拓扑排序和并差集 #include <cstdio> #include <queue&g ...

  10. Windows 1252和ISO 8859-1之间的区别(ISO 8859-1就是Latin-1,但1252与Latin1略有不同)

    2.6.5. ANSI字符编码和Windows 1252 Windows为了支持英语和西欧字符,自己设计了一个编码,对应的在Code Page号是1252,被称为Windows 1252. Windo ...