Size: a a a

SqlCom.ru - Стиль жизни SQL

2020 May 10

🅰

🅰️ртур in SqlCom.ru - Стиль жизни SQL
Alex
У меня все выполнилось
Вероятно, MySql что-то еще хочет.
Предлагаю спросить в сообществе mysql)
Подскажите ссылку на сообщество mySQL?
источник

A

Alex in SqlCom.ru - Стиль жизни SQL
Я не знаю, не занимаюсь mySql)
можно зайти на stackoverflow и там спросить про то, почему запрос выдает ошибку, или погуглить онлайн валидаторы Mysql
источник

A

Alex in SqlCom.ru - Стиль жизни SQL
Mysql lint
источник

YK

Yurii Kovtoniuk in SqlCom.ru - Стиль жизни SQL
🅰️ртур
Подскажите ссылку на сообщество mySQL?
h t t p s : / / t . m e / m y s q l _ d b
удалите пробелы
источник

🅰

🅰️ртур in SqlCom.ru - Стиль жизни SQL
Yurii Kovtoniuk
h t t p s : / / t . m e / m y s q l _ d b
удалите пробелы
Спасибо, нашел 2 сообщества - это одно из них.
источник

A

Alex in SqlCom.ru - Стиль жизни SQL
Я нагуглил вам решение
У mysql другой синтаксис апдтейта

UPDATE book b
INNER JOIN buy_book bb
ON b.book_id = bb.book_id
SET amount = book.amount - buy_book.amount
WHERE bb.buy_id = 5;
источник

🅰

🅰️ртур in SqlCom.ru - Стиль жизни SQL
Alex
Я нагуглил вам решение
У mysql другой синтаксис апдтейта

UPDATE book b
INNER JOIN buy_book bb
ON b.book_id = bb.book_id
SET amount = book.amount - buy_book.amount
WHERE bb.buy_id = 5;
Я как раз так и решил при помощи
источник

🅰

🅰️ртур in SqlCom.ru - Стиль жизни SQL
Dmitriy Ivanov
MySQL update join syntax:

UPDATE tableA a INNER JOIN tableB b ON a.name_a = b.name_b SET validation_check = if(start_dts > end_dts, 'VALID', '') -- where clause can go here

ANSI SQL syntax:

UPDATE tableA SET validation_check = (SELECT if(start_DTS > end_DTS, 'VALID', '') AS validation_check FROM tableA INNER JOIN tableB ON name_A = name_B WHERE id_A = tableA.id_A)
👆
источник

A

Alex in SqlCom.ru - Стиль жизни SQL
а лол)
источник

DS

Dmitry Sidorov in SqlCom.ru - Стиль жизни SQL
Парни привет всем
источник

DS

Dmitry Sidorov in SqlCom.ru - Стиль жизни SQL
Можно как то имея порядковый номер товара исходя из запроса получить сам товар одним запросом? https://prnt.sc/se9mbu
источник

DS

Dmitry Sidorov in SqlCom.ru - Стиль жизни SQL
Там скрин, имея id_good и new ID можно как-то получить одну записть?
источник

ДС

Джон Сноу in SqlCom.ru - Стиль жизни SQL
Чет не понял, что хочешь. Row number может решит твой вопрос?
источник

В

Вячеслав in SqlCom.ru - Стиль жизни SQL
селект из cte с row_number()
источник

В

Вячеслав in SqlCom.ru - Стиль жизни SQL
типа так?
declare @num int =2
declare @id_good int =1
;with cte as(
select *, ROW_NUMBER() over(partition by id_good order by id) as rn
from tablename
)
select *
from cte
where rn = @num and id_good = @id_good
источник

YK

Yurii Kovtoniuk in SqlCom.ru - Стиль жизни SQL
если это MS SQL, то может select top 1 подойдёт
источник

AN

Anton Norko in SqlCom.ru - Стиль жизни SQL
🅰️ртур
UPDATE book SET book.amount = book.amount - buy_book.amount
WHERE  buy_book.buy_id = 5;
апдейт JOIN же поддерживает
источник
2020 May 11

MC

Max Chistyakov in SqlCom.ru - Стиль жизни SQL
Alex
Добрый день, коллеги.
Скажите, а есть ли в SQL-Server встроенный механизм для проверки того, содержит ли в себе строка исполняемый SQL?

например,

declare @a nvarchar(max) = 'test' - не содержит
declare @b nvarchar(max) = 'test; drop database localdb; test' - содержит
отвечу не на вопрос,а предложу решение. Исходя из того, что вы на вход принимаете не всю конструкцию declare @a ... st'(это не выглядит  правильным подходом), а типа таким образом
execute sys.sp_executesql @stmt =N'declare @a nvarchar(max) = @param;
print @a;
', @params = N'@param nchar(4)', @param = 'test';
Вы опасаетесь инъекции вида test подставить test; drop database localdb; test

Во-первых, вы можете использовать топорный способ - ограничивать длину строки типом nchar(4) вместо nvarchar, чтобы кроме значения строкового параметра ничего не влезло.
Во-вторых, вы можете для строковых параметров юзать quotename в теле самого prepared query, всё будет безопасно
execute sys.sp_executesql @stmt =N'declare @a nvarchar(max) = quotename(@param, '''''''');
print @a;
', @params = N'@param nchar(40)', @param = 'test; drop database localdb; test';
источник

A

Alex in SqlCom.ru - Стиль жизни SQL
Max Chistyakov
отвечу не на вопрос,а предложу решение. Исходя из того, что вы на вход принимаете не всю конструкцию declare @a ... st'(это не выглядит  правильным подходом), а типа таким образом
execute sys.sp_executesql @stmt =N'declare @a nvarchar(max) = @param;
print @a;
', @params = N'@param nchar(4)', @param = 'test';
Вы опасаетесь инъекции вида test подставить test; drop database localdb; test

Во-первых, вы можете использовать топорный способ - ограничивать длину строки типом nchar(4) вместо nvarchar, чтобы кроме значения строкового параметра ничего не влезло.
Во-вторых, вы можете для строковых параметров юзать quotename в теле самого prepared query, всё будет безопасно
execute sys.sp_executesql @stmt =N'declare @a nvarchar(max) = quotename(@param, '''''''');
print @a;
', @params = N'@param nchar(40)', @param = 'test; drop database localdb; test';
Спасибо за ответ.
У меня была задачка содержимое некоторых неизвестных мне заранее строк (из гугл-таблицы) превратить в названия колонок в новых таблицах sql-сервера, генерируемых автоматически.
Я решил ее, обрамив эти строки в '[' и ']', предварительно исключив из них эти символы.
Как выяснилось, консрукции, заключенные в квадратные скобки, sql-сервер не воспринимает, как исполняемый код.

Что думаете про такое решение?)
источник

MC

Max Chistyakov in SqlCom.ru - Стиль жизни SQL
всё, что заключено в "" и [], является идентификатором - имена столбцов, наименования представлений и модулей
источник