Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Лучший способ сравнить строку таблицы с набором переменных. SQL 2008  [new]
DiCanio
Member

Откуда:
Сообщений: 1
Привет всем! :)
Меня интересует наилучшая практика сравнения ряда переменных со значениями столбцов в строке таблицы. Например, имеются следующие таблицы:

User:
CREATE TABLE User
(
ID INT ISENTITY(1,1) PRIMARY KEY,
Name NVARCHAR(20),
LastName NVARCHAR(30),
Age INT
)


History:
CREATE TABLE History
(
ID INT ISENTITY(1,1) PRIMARY KEY,
ColumnName NVARCHAR(30),
OldValue NVARCHAR(30),
NewValue NVARCHAR(30)
)


Скажем, при операциях редактирования пользователя нужно запоминать какие атрибуты изменились и как.
Хранимая процедура, обновляющая пользователя, принимает следующие параметры:
@userID, @name, @lastName, @age

Нужно проверить эти параметры с соответствующими значениями столбцов из строки, которую получаем по @userID. Если значения не равны, то внести в таблицу History название колонки, старое и новое значение. В противном случае, данные не вносить.

Пример:
Строка из таблицы User:
1, Антон, Антонов, 21.

В хранимку приходят параметры:
1, Сергей, Антонов, 32.

В таблице должны быть записи:
1, Name, Антон, Сергей
2, Age, 21, 32


Если у вас есть какие-нибудь мысли, предположения, you're welcome :)

With regards,
Paolo Di Canio
5 ноя 13, 01:12    [15076429]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ сравнить строку таблицы с набором переменных. SQL 2008  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
Напишите журналирующий триггер. И таблицу истории сделайте в по человечески.
5 ноя 13, 01:18    [15076444]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ сравнить строку таблицы с набором переменных. SQL 2008  [new]
qwerty112
Guest
DiCanio,

12803376
5 ноя 13, 10:06    [15077025]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ сравнить строку таблицы с набором переменных. SQL 2008  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
DiCanio
History:
CREATE TABLE History
(
ID INT ISENTITY(1,1) PRIMARY KEY,
ColumnName NVARCHAR(30),
OldValue NVARCHAR(30),
NewValue NVARCHAR(30)
)
А хде нормальная форма?
Тем более надо сохранять кто и когда менял. И вот тут не очень хорошо когда меняется пачкой и эта инфа дублируется ...
Более того, декомпозиция - а оно вам надо?
Можно хранить версии - данные целиком. А то так разбиение и доп инфа у каждой строки съест львиную долю памяти и проца (их же потом заходят обратно в строку заворачивать).

А для сравнения есть EXCEPT, который кстати только для строк и работает (нет укороченной версии). Вот поиграйтесь:
DECLARE	@Deleted  TABLE (ID Int PRIMARY KEY, Column1 VarChar(250), Column2 Int, Column3 Float)
DECLARE	@Inserted TABLE (ID Int PRIMARY KEY, Column1 VarChar(250), Column2 Int, Column3 Float)

INSERT	@Deleted  VALUES (1,3,2,1),(2,4,5,NULL),(3,NULL,8,9)
INSERT	@Inserted VALUES (1,1,2,3),(2,4,5,NULL),(3,7,NULL,9)

	SELECT * FROM @Deleted
EXCEPT	SELECT * FROM @Inserted

SELECT	D.ID
,	(SELECT D.Column1 EXCEPT SELECT I.Column1) AS Column1
,	(SELECT D.Column2 EXCEPT SELECT I.Column2) AS Column2
,	(SELECT D.Column3 EXCEPT SELECT I.Column3) AS Column3
FROM		@Deleted	D
LEFT JOIN	@Inserted	I ON I.ID = D.ID
WHERE	Exists(SELECT D.* EXCEPT SELECT I.*)
С переменными аналогично.

Некоторые с хмулем играются. Всё дело в задаче - что с этой историей делать, сколько хранить и т.п. ...
5 ноя 13, 20:09    [15080929]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ сравнить строку таблицы с набором переменных. SQL 2008  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
DiCanio,

Age INT - это моветон.

Используете 4 байта вместо одного.
На возраст идёт только tinyint 0-255.

Далее.
Зачем вам в History нужна "ID INT ISENTITY(1,1) PRIMARY KEY,"?

Что вы с ним будете делать?

Гораздо проще сделать копию таблички User с добавкой поля datatime2

Тогда данные туда заливать будете через OUTPUT и любые изменения для любого юзера по любому полю можете отслеживать по дате.
6 ноя 13, 01:28    [15082128]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ сравнить строку таблицы с набором переменных. SQL 2008  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
SandalTree,
Вот никак понять не могу, вы это специально, да?
SandalTree
Age INT - это моветон.
После слова моветон, думается, ай не заметил, ну конечно идиотизм писать в постоянную таблицу такую переменную величину как возраст - т.е. писать дату рождения и всё, остальное (возраст) вычисляется в запросе (представление).

Но тут внезапно:
SandalTree
Используете 4 байта вместо одного.
На возраст идёт только tinyint 0-255.
Тонко.

Остальное боян.
6 ноя 13, 11:10    [15083029]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ сравнить строку таблицы с набором переменных. SQL 2008  [new]
поклонник SandalTree
Guest
Mnior
SandalTree,
Вот никак понять не могу, вы это специально, да?
SandalTree
Age INT - это моветон.
После слова моветон, думается, ай не заметил, ну конечно идиотизм писать в постоянную таблицу такую переменную величину как возраст - т.е. писать дату рождения и всё, остальное (возраст) вычисляется в запросе (представление).

Но тут внезапно:
SandalTree
Используете 4 байта вместо одного.
На возраст идёт только tinyint 0-255.
Тонко.

Остальное боян.


а я вот из поклонника Александра52 переквалифицируюсь в поклонника SandalTree.
и вообще. думаю, где это мне уже попадались подобные советы, стиль такой знакомый...?
+

Когда роняет чашку гость,
Не бейте гостя в лоб.
Другую чашку дайте, пусть
Он пьет спокойно чай.
Когда и эту чашку гость
Уронит со стола,
В стакан налейте чай ему,
И пусть спокойно пьет.
Когда же всю посуду гость
В квартире перебьет,
Придется сладкий чай налить
За шиворот ему.
6 ноя 13, 14:49    [15084871]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ сравнить строку таблицы с набором переменных. SQL 2008  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Mnior
SandalTree,
Вот никак понять не могу, вы это специально, да?
SandalTree
Age INT - это моветон.
После слова моветон, думается, ай не заметил, ну конечно идиотизм писать в постоянную таблицу такую переменную величину как возраст - т.е. писать дату рождения и всё, остальное (возраст) вычисляется в запросе (представление).

Но тут внезапно:
SandalTree
Используете 4 байта вместо одного.
На возраст идёт только tinyint 0-255.
Тонко.

Остальное боян.


Блин, ну ко всему вы придерётесь.

Знаю я что возраст должен быть вычисляемый и что лучше хранить дату, а не возраст.
Должен был-ли я указать на это ТСу?

Я указал на то что возраст не хранить в INT некрасиво и что лучше его хранить в TINYINT.

Если вы со мной не согласны, тогда ОЙ.

ЗЫ Я так понимаю за те годы что я тут не появлялся тут сложилась добротная каста, неприемлющая новичков. Ну так мне наплевать на вашу касту.

А если я где не прав, поправьте, скажу спасибо.
7 ноя 13, 05:09    [15088598]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ сравнить строку таблицы с набором переменных. SQL 2008  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
SandalTree
ЗЫ Я так понимаю за те годы что я тут не появлялся тут сложилась добротная каста, неприемлющая новичков. Ну так мне наплевать на вашу касту.

А если я где не прав, поправьте, скажу спасибо.
Не, не прав. Всё нормально, дело в написанном, а не в нике сбоку сообщения.

PS: Да хоть совсем уберите левую часть у постов, только текст и цитируемый текст, по теме.
7 ноя 13, 11:30    [15089627]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить