SQL Server Delete
https://ask.chadgpt.ru/share/ca0f14c0-5b36-4f36-8762-0f4d76aff440
Заходим в Programs
Выбираем SQL Server
Жмем update/delete
Запускается Установщик
Удаляем ненужный экземпляр.
4. Почему не удаётся сейчас подключиться из .NET Core?
Частые причины:
- В проекте не добавлен нужный NuGet-пакет (Microsoft.Data.SqlClient, а не System.Data.SqlClient).
- Используется неправильная строка подключения или не указан TCP-порт.
- SQL Server настроен только на Named Pipes/Shared Memory (локальное соединение через SSMS — ок, а с внешних машин/через TCP — не работает).
- SQL Server Express по умолчанию ставится с отключённым TCP/IP (проверьте через SQL Server Configuration Manager).
- Тип аутентификации: SQL Server поддерживает только Windows-аутентификацию, а вы пытаетесь через SQL логин. Или наоборот.
Для учебных и домашних проектов лучше всего Developer — он дает всё, как “в бою”, но БД нельзя развертывать “в бизнесе”, только учиться или тестировать.
Если маленькая “рабочая” база — можно Express.
Для компаний и продуктов — только коммерческие лицензии (Standard/Enterprise), их функционал не урезан, нет ограничений на размер, машины и ресурсы.
-------------------------------------
1. Установите NuGet‑пакет
Выполните:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer2. Определите модель
public class TestTable2
{
public int ID { get; set; }
public int DataInt { get; set; }
public string DataChar { get; set; }
}3. Создайте DbContext
using Microsoft.EntityFrameworkCore;
public class TestDbContext : DbContext
{
public DbSet<TestTable2> TestTable2 { get; set; }
private string _connectionString;
public TestDbContext(string connectionString)
{
_connectionString = connectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(_connectionString);
}
}4. Основной код программы
using System;
using System.Linq;
namespace Ca_DB_Model_Init_02
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
string connectionString = "Server=WIN-0EMQO515V3S\\SQLDVLP25;Database=TestDataBase;Integrated Security=True;Trust Server Certificate=True";
try
{
using (var db = new TestDbContext(connectionString))
{
var records = db.TestTable2.ToList();
foreach (var row in records)
{
Console.WriteLine($"Id: {row.ID}, : {row.DataInt}, : {row.DataChar}");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка подключения: {ex.Message}");
}
}
}
}----------------Int, bigintDateTime, DateTime2Modified, CreatedОба типа, datetime и datetime2, используются в SQL Server для хранения даты и времени, но между ними есть отличия:
1. datetime2 — рекомендуемый выбор:
datetime2
— более новый тип, обладает большей точностью (до 7 знаков после
запятой) и может хранить более широкий диапазон дат: от 0001-01-01 до
9999-12-31. datetime — старый тип, точность до 3 миллисекунд, диапазон от 1753-01-01 до 9999-12-31.
2. Совместимость с C#:
В C# оба обычно связывают с типом DateTime.
3. Рекомендация Microsoft:
- Microsoft рекомендует использовать
datetime2 для новых разработок потому что он более современный и гибкий - (https://learn.microsoft.com/ru-ru/sql/t-sql/data-types/datetime2-transact-sql).
Чтобы поле Modified заполнялось автоматически при добавлении записи в SQL Server,
используйте тип данных datetime2 (или datetime) и укажите в определении столбца значение по умолчанию —
функцию SYSDATETIME() (для datetime2) или GETDATE() (для datetime).
Пример:
CREATE TABLE YourTable (
Id int PRIMARY KEY,
OtherColumn nvarchar(100),
Modified datetime2 NOT NULL DEFAULT SYSDATETIME()
);
или для уже существующей таблицы:
ALTER TABLE YourTable ADD Modified datetime2 NOT NULL DEFAULT SYSDATETIME();
или, если столбец уже есть, но нет значения по умолчанию:
ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable_Modified DEFAULT SYSDATETIME() FOR Modified;
---
INSERT INTO [dbo].[TestTable2]
([DataInt], [DataChar], [Created], [Modified])
VALUES
(101, N'Первая запись', SYSDATETIME(), SYSDATETIME()),
(202, N'Вторая запись', SYSDATETIME(), SYSDATETIME());
-----
Для того чтобы при вставке новых записей поля Created и
Modified автоматически заполнялись текущим временем, им нужно задать
значение по умолчанию через DEFAULT.
Это можно сделать при создании таблицы или для уже существующей с помощью ALTER TABLE.
Пример для уже существующей таблицы:
-- Для столбца Created
ALTER TABLE [dbo].[TestTable2]
ADD CONSTRAINT DF_TestTable2_Created DEFAULT (SYSDATETIME()) FOR [Created];
-- Для столбца Modified
ALTER TABLE [dbo].[TestTable2]
ADD CONSTRAINT DF_TestTable2_Modified DEFAULT (SYSDATETIME()) FOR [Modified];
Теперь, если при вставке не указывать значения для этих столбцов,
они будут автоматически заполнены текущей датой и временем.
Пример вставки — теперь без указания дат:
INSERT INTO [dbo].[TestTable2] ([DataInt], [DataChar])
VALUES (101, N'Первая запись'), (202, N'Вторая запись');
Проверьте результат:
SELECT * FROM [dbo].[TestTable2];
-----
Table - coздаем поле Midified c обновленеим при INSERT, UPDATE
- создаем поле Created c обновленеим при INSERTВот пример хранимой процедуры, которая принимает:
- @TableName — имя создаваемой таблицы
- @IdType — тип ID-поля:
'int' или 'bigint' (по умолчанию 'int')
Также создаёт поля ID, Created (дату создания),
Modified (дату последнего изменения,
обновляется и при вставке, и при обновлении).
CREATE PROCEDURE dbo.CreateStandardTable
@TableName NVARCHAR(128),
@IdType NVARCHAR(10) = N'int'
AS
BEGIN
SET NOCOUNT ON;
-- Проверьте существование таблицы
IF EXISTS (
SELECT * FROM sys.tables WHERE name = @TableName AND schema_id = SCHEMA_ID('dbo')
)
BEGIN
RAISERROR(N'Таблица %s уже существует.', 16, 1, @TableName);
RETURN;
END
-- Собираем динамический SQL для создания таблицы
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'CREATE TABLE [dbo].[' + @TableName + N'] (
[ID] ' + @IdType + N' IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Created] DATETIME2 NOT NULL CONSTRAINT DF_' + @TableName + N'_Created DEFAULT (SYSDATETIME()),
[Modified] DATETIME2 NOT NULL CONSTRAINT DF_' + @TableName + N'_Modified DEFAULT (SYSDATETIME())
);
';
-- Выполняем создание таблицы
EXEC sp_executesql @sql;
-- Создаём триггер для автоматического обновления Modified
DECLARE @trgSql NVARCHAR(MAX);
SET @trgSql = N'
CREATE TRIGGER [TRG_' + @TableName + N'_Modified]
ON [dbo].[' + @TableName + N']
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE t
SET Modified = SYSDATETIME()
FROM [dbo].[' + @TableName + N'] t
INNER JOIN inserted i ON t.ID = i.ID;
END;
';
EXEC sp_executesql @trgSql;
END- Процедура проверяет, существует ли уже таблица с таким именем.
- Создает таблицу с указанными полями и дефолтами на даты.
- После создания добавляет триггер, который обновляет поле
Modifiedпри UPDATE. - Поле
Createdавтоматически проставляется при INSERT. - Тип ID будет
intилиbigint, по вашему выбору.
После этого строка добавится, все поля заполнятся автоматически.
Когда вы получите ошибку?
Если хотя бы у одного поля в таблице:
- тип NOT NULL
- и нет ни значения по умолчанию (DEFAULT), ни IDENTITY, ни вычисляемого (COMPUTED)
то INSERT DEFAULT VALUES вызовет ошибку.
В T‑SQL (MS SQL Server) сделать полностью "пустой" UPDATE,
чтобы не изменять ни одного значения, нельзя напрямую.
Команда вида:
UPDATE TestTable3 SET;— вызовет синтаксическую ошибку.
Однако вы можете явно указать установку столбца в его текущее значение. Например, если ваша таблица называется TestTable3, и у неё есть столбец, допустим, Id, вы обновляете так:
UPDATE TestTable3 SET Id = Id;Или если таблица содержит другие столбцы (например, Name), можно выполнить:
UPDATE TestTable3 SET Name = Name;Это обновление не меняет значения в таблице фактически, но "проходит" как UPDATE. Все триггеры и вычисляемые поля, связанные с UPDATE (например, поля Modified с дефолтом GETDATE() ON UPDATE или через триггер), будут обработаны.
Если вы хотите обновить только одну строку (например, ту, которую только что вставили), добавьте WHERE:
UPDATE TestTable3 SET Id = Id WHERE Id = 123;— где Id = 123 — условие для нужной строки.
Важное замечание:
Поле
Created обычно заполняется один раз (при вставке), тогда как поле
Modified обновляется при каждом UPDATE (обычно через триггер или
выражение типа DEFAULT GETDATE() OVER UPDATE, если используется более
современная версия SQL Server).
Вывод:
"Пустой" UPDATE — это UPDATE с присваиванием любого столбца самого себе. Например:
UPDATE TestTable3 SET [ЛюбойСтолбец] = [ЛюбойСтолбец];Это защёлка для вызова триггеров, пересчёта computed-столбцов или обновления вашего поля Modified.
в SQL сервере (MS SQL Server), имена столбцов (и таблиц) не обязательно брать в кавычки, если их имена не содержат пробелов, специальных символов или не совпадают с зарезервированными словами. В вашем примере:
UPDATE TestTable3 SET Name = Name;оба Name
— это ссылка на одноимённый столбец таблицы. Кавычки не требуются, если
имя столбца простое, латинское и без спецсимволов или пробелов.
Однако, если бы имелся столбец с названием, например, My Name (с пробелом), тогда его пришлось бы взять в квадратные скобки:
UPDATE TestTable3 SET [My Name] = [My Name];Итак,
Name = Name— корректный синтаксис для стандартного столбца без кавычек/скобок.- Если столбец называется странно или совпадает с ключевым словом, заключите его в квадратные скобки:
[Name].
P.S. Английское слово Name
редко бывает зарезервированным в популярнейших диалектах SQL, поэтому
без скобок или кавычек писать его обычно разрешается и работает
корректно.
----------------
В SQL выражении:
UPDATE TestTable3 SET Name = Name;Оба Name обозначают не строковое значение, а имя столбца таблицы.
То есть, для каждой строки таблицы вы присваиваете столбцу Name его же текущее значение.
По сути, эта команда ничего не меняет в таблице.
Когда нужны кавычки:
Если вы хотите присвоить столбцу Name строковое значение, например, “Петя”,
тогда действительно пишется так:
UPDATE TestTable3 SET Name = 'Петя';Здесь 'Петя' — это строковое значение, и кавычки обязательны.
Когда кавычки НЕ нужны:
В вашем изначальном варианте UPDATE TestTable3 SET Name = Name;
оба раза Name — это ссылка на столбец, никаких кавычек не надо.
Итого:
Name = Name— обе части указывают на столбец, кавычки не нужны.Name = 'something'— справа строка, кавычки нужны.
Если хотите присвоить строку, берите в кавычки.
Если копируете значения из столбца — кавычки не нужны.
SQL-запрос сработал именно так, как вы ожидали.
Вот что произошло:
- Вы обновили столбец
[Name]на значение'NAME1'только для той записи, у которой[ID] = 2. - В результате, только у записи с
[ID] = 2поле[Name]изменилось (стало'NAME1'), а поле[Modified]получило новое значение времени (это обычно делается через триггер или в ручную ставится новое время, если логика такая заложена). - У записей с
[ID] = 1и[ID] = 3изменений нет ([Name]остался прежним,[Modified]тоже не поменялся).
Объяснение:
Оператор UPDATE меняет только те строки, которые подходят под условие в WHERE. Все остальные остаются без изменений.
Обновляемые столбцы (например, Modified) могут обновляться автоматически, если в таблице есть триггер на обновление,
либо вы явно задаёте новое значение через SET Modified = GETDATE(), например.
В вашем примере видно:
- ID 1: нет обновления, поля как были, так и остались.
- ID 2: имя обновилось, время обновлено — видно, что была операция изменения строки.
- ID 3: всё без изменений.
Всё
логично и подтверждает корректную работу запроса и базы данных. Если
нужно автоматически обновлять дату последних изменений (Modified), обычно используют триггеры на таблице,
или добавляют в UPDATE ещё одну колонку:
UPDATE TestTable3
SET [Name] = 'NAME1', [Modified] = GETDATE()
WHERE [ID] = 2Тогда время изменения фиксировалось бы прямо при апдейте.
Если остались вопросы по SQL или по работе с базой данных — спрашивайте!
Комментариев нет:
Отправить комментарий