Как сделать truncate для массива таблиц?

  1. 1 г. назад

    Господа, вот прямо чувствую, что можно прямо из консоли скуля забубенить truncate для множества таблиц по списку? Вручную долго, утилита на C#, которую я рисогвал много лет назад, на этом скуле плохо живут.

    Ответы: (9) (12) (22)
  2. Из консоли нельзя.

    table_name
    Имя таблицы, которая должна быть усечена, или таблицы, из которой удаляются все строки. table_name должно быть литералом. table_name не может быть функцией OBJECT_ID() или переменной.

    Ответы: (2)
  3. (1) было так:

    using System;
    using System.Data.SqlClient;
    using System.IO;
    using System.Text;
    
    namespace SQL_Table_Cleaner
    {
        internal class Program
        {
            private static string Server = "";
            private static string DataBase = "";
            private static string Login = "";
            private static string Password = "";
            private static SqlConnection Conn;
    
            private static void Main(string[] args)
            {
                if (new FileInfo("settings.ini").Exists)
                {
                    StreamReader streamReader1 = new StreamReader("settings.ini", Encoding.Default);
                    string str1;
                    while ((str1 = streamReader1.ReadLine()) != null)
                    {
                        if (str1.Length > 0 && str1.Substring(0, 1) != "*")
                        {
                            string[] strArray = str1.Split('=');
                            if (strArray.Length > 1)
                            {
                                if (strArray[0] == "Server")
                                    Program.Server = strArray[1];
                                if (strArray[0] == "DataBase")
                                    Program.DataBase = strArray[1];
                                if (strArray[0] == "Login")
                                    Program.Login = strArray[1];
                                if (strArray[0] == "Password")
                                    Program.Password = strArray[1];
                            }
                        }
                    }
                    streamReader1.Close();
                    if (Program.Server != "" && Program.DataBase != "" && Program.Login != "" && Program.Password != "")
                    {
                        if (new FileInfo("tables.ini").Exists)
                        {
                            DateTime now1 = DateTime.Now;
                            Console.WriteLine("Process started at " + now1.ToString());
                            Program.Conn = new SqlConnection("Data Source=" + Program.Server + ";Initial Catalog=" + Program.DataBase + ";User Id=" + Program.Login + ";Password=" + Program.Password + ";");
                            Program.Conn.Open();
                            StreamReader streamReader2 = new StreamReader("tables.ini", Encoding.Default);
                            string str2;
                            while ((str2 = streamReader2.ReadLine()) != null)
                            {
                                if (str2.Length > 0 && str2.Substring(0, 1) != "*")
                                    Program.CleanTable(str2.Trim());
                            }
                            streamReader2.Close();
                            Program.Conn.Close();
                            DateTime now2 = DateTime.Now;
                            TimeSpan timeSpan = now2 - now1;
                            int num = timeSpan.Hours;
                            string str3 = num.ToString();
                            num = timeSpan.Minutes;
                            string str4 = num.ToString();
                            num = timeSpan.Seconds;
                            string str5 = num.ToString();
                            Console.WriteLine("Process ended at " + now2.ToString() + "... " + str3 + "h " + str4 + "m " + str5 + "s");
                        }
                        else
                            Console.WriteLine("File 'tables.ini' is not exist!");
                    }
                    else
                        Console.WriteLine("File 'settings.ini' is incorrect!");
                }
                else
                    Console.WriteLine("File 'settings.ini' is not exist!");
                Console.Read();
            }
    
            private static void CleanTable(string TableName)
            {
                DateTime now1 = DateTime.Now;
                try
                {
                    new SqlCommand("TRUNCATE TABLE _" + TableName, Program.Conn).ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                DateTime now2 = DateTime.Now;
                TimeSpan timeSpan = now2 - now1;
                string str1 = timeSpan.Hours.ToString();
                int num = timeSpan.Minutes;
                string str2 = num.ToString();
                num = timeSpan.Seconds;
                string str3 = num.ToString();
                Console.WriteLine("Table " + TableName + " truncated : " + now2.ToString() + "... " + str1 + "h " + str2 + "m " + str3 + "s");
            }
        }
    }
    
  4. 26.12.2022 13:37:06 отредактировано ТеньД

    DECLARE tables table (TABLE_NAME nvarchar(256), i int identity(1,1))
    DECLARE Counter int, MaxTablesCount int
    DECLARE Name nvarchar(100)
    DECLARE sql nvarchar(2048)

    USE [цензура]
    INSERT INTO tables(TABLE_NAME) SELECT TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG=N'<цензура>' AND (PATINDEX('_Document%', TABLE_NAME) > 0 OR PATINDEX('_AccumRg%', TABLE_NAME) > 0 OR PATINDEX('_AccRg%', TABLE_NAME) > 0)

    SET MaxTablesCount = (SELECT COUNT(i) from tables)
    SET Counter = 1

    BEGIN
    WHILE Counter <= MaxTablesCount
    BEGIN

    SET Name = (SELECT TABLE_NAME from tables where i=@Counter)
    BEGIN TRY
    SET sql = 'TRUNCATE TABLE ' + Name
    PRINT sql
    END TRY
    BEGIN CATCH
    PRINT ERROR_MESSAGE()
    END CATCH
    EXEC(@sql)
    SET Counter = Counter + 1

    END

    END

    Ответы: (4)
  5. (3) так мне-то нужно по листу из 100500 таблиц сделать...

    Ответы: (10)
  6. Лист - в файле.

  7. А-аа...

  8. Стоп.

  9. Был бы у меня тестовый сервак...

  10. 26.12.2022 13:47:43 отредактировано sda553

    (0) мне проще в ексель загнать названия таблиц и сделать команды truncate там на каждую с точкой запятой в конце каждой строки

    Ответы: (12)
  11. Дуб так мне-то нужно по листу из 100500 таблиц сделать...

    Сделай кошерный селект к INFORMATION_SCHEMA.TABLES и получи актуальный список таблиц

    Ответы: (11)
  12. (10) дяденька, я не настоящий сварщик.

  13. Это как? Мне надо снести содержимое таблиц на скуле.

    Ответы: (14) (15)
  14. (13) главное бэкап перед этим не делай

  15. (13) в колонке A екселя вводишь названия таблиц
    В колонке B вводишь формулу ="truncate table " & A1 & ";"
    Растягиваешь формулу на всю колонку B, копипастишь получившееся текстовое содержимое в клиента скульного

    Ответы: (16)
  16. (15) а соединение с сервером?

    Ответы: (17)
  17. 26.12.2022 14:10:29 отредактировано sda553

    (16) клиент скульный делает соединение с сервером, а ты туда в своего любимого query клиента копипастишь колонку B из екселя и там нажимаешь "Выполнить"

    Ответы: (18)
  18. (17) это всё из экселя? А пример файла - можно?

    Ответы: (19) (21)
  19. Рыдал и локтем слезы вытирал

  20. (18) смотри видео, начиная со 2й минуты и до конца.
    В твоем случае в екселе формула будет не с insert а с truncate

  21. 27.12.2022 06:58:51 отредактировано webdev

    (0) В текстовом редакторе, в твоем файле, замени имена таблиц на команды по усечению этих таблиц. Типа вот так:
    Было:
    Таблица1, таблица2, таблица3

    Стало:
    TRUNCATE TABLE Таблица1; TRUNCATE TABLE таблица2; TRUNCATE TABLE таблица3;

    Понятно? Посто автоматом заменить в файле все запятые (или любой другой твой разделитель) на вот это ; TRUNCATE TABLE
    С точкой с запятой, с пробелом. Ну и в начале и в самом конце добавить недостающее.
    И потом скопировать этот текст, вставить его вручную в консоль сервера SQL, и выполнить сразу пачку запросов как один.

    Ответы: (24)
  22. Во, почти как советовали сделать с Экселем, только эксель не нужен. Достаточно блокнота.

  23. Ой блииин... А чего-ж я мосх канпостировал всё это время?..
    Мои благодарности!
    Век живи - век учись. И дураком помрёшь.
    Ни тебе адаптеров, ни тебе сборок...

    (22) именно так и сделал. Но смысл тот же самый.

или зарегистрируйтесь чтобы ответить!