Господа, вот прямо чувствую, что можно прямо из консоли скуля забубенить truncate для множества таблиц по списку? Вручную долго, утилита на C#, которую я рисогвал много лет назад, на этом скуле плохо живут.
Из консоли нельзя.
table_name
Имя таблицы, которая должна быть усечена, или таблицы, из которой удаляются все строки. table_name должно быть литералом. table_name не может быть функцией OBJECT_ID() или переменной.
(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"); } } }
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
Лист - в файле.
А-аа...
Стоп.
Был бы у меня тестовый сервак...
(10) дяденька, я не настоящий сварщик.
(13) главное бэкап перед этим не делай
Рыдал и локтем слезы вытирал
(18) смотри видео, начиная со 2й минуты и до конца.
В твоем случае в екселе формула будет не с insert а с truncate
(0) В текстовом редакторе, в твоем файле, замени имена таблиц на команды по усечению этих таблиц. Типа вот так:
Было:
Таблица1, таблица2, таблица3
Стало:
TRUNCATE TABLE Таблица1; TRUNCATE TABLE таблица2; TRUNCATE TABLE таблица3;
Понятно? Посто автоматом заменить в файле все запятые (или любой другой твой разделитель) на вот это ; TRUNCATE TABLE
С точкой с запятой, с пробелом. Ну и в начале и в самом конце добавить недостающее.
И потом скопировать этот текст, вставить его вручную в консоль сервера SQL, и выполнить сразу пачку запросов как один.
Во, почти как советовали сделать с Экселем, только эксель не нужен. Достаточно блокнота.
Ой блииин... А чего-ж я мосх канпостировал всё это время?..
Мои благодарности!
Век живи - век учись. И дураком помрёшь.
Ни тебе адаптеров, ни тебе сборок...
(22) именно так и сделал. Но смысл тот же самый.