Change the ANSI_NULLS setting for all Stored Procedures in the Database

前端 未结 4 395
情书的邮戳
情书的邮戳 2021-01-13 06:21

We have some problems with the ANSI_NULLS setting and computed columns and we have a ton of stored procedures that have

SET ANSI_NULLS OFF

4条回答
  •  滥情空心
    2021-01-13 06:54

    The solution that we use was the posted by Ian and now we have an automated procedure to solve the problem.

    Here is the final code that we use to recreate all the SPs from the database:

    public static class AnsiNullsManager
    {
    
        public static void ReCreateAllStoredProcedures(SqlConnection connection, bool ansiNullsOn)
        {
            var sql =
                @"select object_name(sys.all_sql_modules.object_id) as Name, definition as Code
                    from sys.all_sql_modules inner join sys.objects ON 
                    sys.all_sql_modules.object_id = sys.objects.object_id
                    where objectproperty(sys.all_sql_modules.object_id, 'IsProcedure') = 1 AND is_ms_shipped = 0 and uses_ansi_nulls = " +
                (ansiNullsOn ? "0" : "1") +
                "ORDER BY Name ";
    
            if (connection.State == ConnectionState.Closed)
                connection.Open();
    
            var sps = new List();
    
            var cmd = connection.CreateCommand();
            cmd.CommandText = sql;
    
            using (var reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    sps.Add(new SpObject(reader.GetString(0), reader.GetString(1)));
                }
            }
    
            var cmdSetAnsiNulls = connection.CreateCommand();
            cmdSetAnsiNulls.CommandText = "SET ANSI_NULLS " + (ansiNullsOn ? "ON" : "OFF") + ";";
            cmdSetAnsiNulls.ExecuteNonQuery();
    
            foreach (var sp in sps)
            {
                var trans = connection.BeginTransaction();
    
                try
                {
    
                    var cmdDrop = connection.CreateCommand();
                    cmdDrop.CommandText = "DROP PROCEDURE " + sp.Name;
                    cmdDrop.Transaction = trans;
                    cmdDrop.ExecuteNonQuery();
    
    
    
                    var cmdReCreate = connection.CreateCommand();
                    cmdReCreate.CommandText = sp.Code;
                    cmdReCreate.Transaction = trans;
                    cmdReCreate.ExecuteNonQuery();
                    trans.Commit();
    
                }
                catch (Exception)
                {
                    trans.Rollback();
                    throw;
                }
            }
    
        }
    
        private class SpObject
        {
            public SpObject(string name, string code)
            {
                Name = name;
                Code = code;
            }
    
            public string Name { get; private set; }
            public string Code { get; private set; }
        }
    
    }
    

提交回复
热议问题