运行两个动态sql创建脚本会导致'CREATE TRIGGER'必须是查询批处理中的第一个语句。错误

时间:2018-01-18 14:20:51

标签: c# sql sql-server-2012 ado.net

我有一个c#方法,它针对数据库运行sql命令,看起来像这个

    public DataTable RunSqlDataTable(string sql, string returnTableName = null)
    {
        if (!string.IsNullOrEmpty(sql))
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                using (SqlCommand command = new SqlCommand(sql, connection))
                {
                    connection.Open();

                    DataTable table = new DataTable();
                    if (!string.IsNullOrEmpty(returnTableName))
                        table.TableName = returnTableName;
                    // Execute reader allows for the primary key to be retrieved
                    using (var reader = command.ExecuteReader(CommandBehavior.KeyInfo))
                    {
                        table.Load(reader);
                    }
                    return table;
                }
            }
        }
        return null;
    }

我首先使用此代码运行代码

string slq = @"CREATE TABLE TestTable(
 [Id]  int  NOT NULL ,
 [col1]  int  NOT NULL
);"

sqlHelper.RunSqlDataTable(sql);

然后我跑

sql = @"CREATE TRIGGER [trg_TestTable]
ON [TestTable]
AFTER INSERT, UPDATE, DELETE 
AS
  BEGIN
 IF EXISTS(SELECT * FROM inserted)
 BEGIN
     INSERT OtherTable(A, B, C)
         SELECT 'XXX', inserted.Id, getdate()
         FROM inserted
 END

 IF EXISTS(SELECT * FROM deleted)
 BEGIN
         INSERT OtherTable(A,B,C)
         SELECT 'XXX', deleted.Id, getdate()
         FROM deleted
 END
 END;

sqlHelper.RunSqlDataTable(sql);

但是第二行引发异常

'CREATE TRIGGER'必须是查询批处理中的第一个语句。

这被提炼到仍然存在问题的最小值。 在实际的代码中,我创建索引和外键和约束,然后在最终添加触发器的所有情况下,它只是引发异常的触发器。
我不能使用GO,因为那是无效的T-Sql。我正在使用.net 4.5

为什么我得到异常,因为CREATE TRIGGER sql是该命令中唯一的查询?

此致 尼克

1 个答案:

答案 0 :(得分:1)

要创建触发器,请使用SqlCommand.ExecuteNonQuery而不是RunSqlDataTable