Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
klara1,

А вот такая конструкция у вас допустима? Синтаксически тут всё правильно
update [prot] set x = [prot].x + 1
4 июн 13, 12:21    [14388208]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
А зачем вообще INTO, мне всегда спросить хочется.
4 июн 13, 12:22    [14388213]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Гость333,
klara1
Но теперь такая заморочка: надо, чтобы в этом поле отбирались все подобные ошибки, исключая словосочетание
INSERT INTO [PROT](
То есть после [prot] сразу может стоять скобка, если перед ним словосочетание INSERT INTO
И это не должно отбираться.:)

ЭТо уже вопрос к ТС
4 июн 13, 12:23    [14388216]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
klara1
Member

Откуда:
Сообщений: 79
Гость333,

да.
4 июн 13, 12:47    [14388340]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
klara1
Member

Откуда:
Сообщений: 79
iap,

формулы пишет другой разработчик, мне нужно их проверить
4 июн 13, 12:48    [14388349]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
klara1
Member

Откуда:
Сообщений: 79
Сергей Викт.,

Работает, спасибо, буду тестировать дальше...
4 июн 13, 12:48    [14388355]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
klara1
iap,

формулы пишет другой разработчик, мне нужно их проверить
Но INTO может быть, а может не быть - это же не ошибка!
А Вы ничего об этом не говорите.

В общем, я думаю, что поскольку индексы всё равно идут лесом, то сначала надо причесать
проверяемую строку к некоторому каноническому виду,
а уж потом проверять наличие. отсутствие в ней неких "ключевых слов".

Например, все разделители заменить на пробелы,
все множественные пробелы заменить на единичные пробелы,
слева и справа к строке добавить по одному разделителю
для исключения влияния начала и конца строки и т.п.

И, да! Вас не затруднит в дальнейшем пользоваться тегом [SRС]?
4 июн 13, 12:54    [14388408]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
klara1
iap,

формулы пишет другой разработчик, мне нужно их проверить

А каким образом он организует эти данные? Может быть правильнее было бы на его стороне корректно формировать строку запроса? Т.к. соглашусь с iap, есть достаточно много ситуаций с разным использованием инструкции.

Например
INSERT INTO tbl

INSERT tbl

INSERT tbl
SELECT a,b,c

INSERT INTO tbl
VALUES(a,b,c),(a,c,b)
4 июн 13, 12:59    [14388464]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
klara1
Member

Откуда:
Сообщений: 79
всё работает, вот что получилось с вашими советами:
USE [basa]

declare @Masks table (
	Mask nvarchar(20) primary key
);

insert into @Masks (Mask)
values
	('%[^ ]\[prot\]%')
insert into @Masks (Mask)
values	('%\[prot\][^ ]%')



select *
from dbo.frm_control t
where exists (
select 0 from @Masks ms where t.auto_edit like ms.Mask escape '\'
) AND t.auto_edit not like '%INSERT INTO \[prot\](%' escape'\'


только одна проблема. Есть поля, где в auto_edit есть такая формула:
insert into [PROT]
SELECT...

и т.д.
То есть слово Select начинается с новой строки и как бы после [PROT] без пробела... Поэтому строки с такой формулой в графе auto_edit отбираются в запросе, а их не надо.
Как бы заложить условие, что если после [PROT] не пробел, а нажали enter и пишут с новой строки, чтобы эта строка тоже не выводилась?
5 июн 13, 17:07    [14396019]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
klara1
всё работает, вот что получилось с вашими советами:
USE [basa]

declare @Masks table (
	Mask nvarchar(20) primary key
);

insert into @Masks (Mask)
values
	('%[^ ]\[prot\]%')
insert into @Masks (Mask)
values	('%\[prot\][^ ]%')



select *
from dbo.frm_control t
where exists (
select 0 from @Masks ms where t.auto_edit like ms.Mask escape '\'
) AND t.auto_edit not like '%INSERT INTO \[prot\](%' escape'\'


только одна проблема. Есть поля, где в auto_edit есть такая формула:
insert into [PROT]
SELECT...

и т.д.
То есть слово Select начинается с новой строки и как бы после [PROT] без пробела... Поэтому строки с такой формулой в графе auto_edit отбираются в запросе, а их не надо.
Как бы заложить условие, что если после [PROT] не пробел, а нажали enter и пишут с новой строки, чтобы эта строка тоже не выводилась?

Вроде переход на новую строку хранится в строке в виде двух последовательных пробелов. Или я ошибаюсь?
5 июн 13, 17:16    [14396079]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
А ещё лучше приведите, пожалуйста, реальный пример:) Так проще будет придумать
5 июн 13, 17:16    [14396086]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей Викт.
Вроде переход на новую строку хранится в строке в виде двух последовательных пробелов. Или я ошибаюсь?

Вы ошибаетесь.
5 июн 13, 17:26    [14396135]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Гость333
Сергей Викт.
Вроде переход на новую строку хранится в строке в виде двух последовательных пробелов. Или я ошибаюсь?

Вы ошибаетесь.

хм. Просто сделал мини запрос и получил 2 пробела

SELECT 'asd
asasdf'

Выводит в одном столбце, копирую в блокнот - 2 пробела))) Я для чего собственно спросил, как в t-SQL при разборе найти переход на новую строчку?:)
5 июн 13, 17:27    [14396144]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей Викт.,

DECLARE @str varchar(10);

SET @str = 'asd
asa';

WITH numbers(n) AS
(
  SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL
  SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10
)
SELECT n.n, ASCII(SUBSTRING(@str, n.n, 1)) as code
FROM numbers n
WHERE n.n <= LEN(@str);

n           code
----------- -----------
1           97
2           115
3           100
4           13
5           10
6           97
7           115
8           97
5 июн 13, 17:38    [14396219]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей Викт.
Выводит в одном столбце, копирую в блокнот - 2 пробела)))

А теперь выведите result to text и попробуйте найди эти два пробела.
5 июн 13, 17:39    [14396227]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Гость333
Сергей Викт.
Выводит в одном столбце, копирую в блокнот - 2 пробела)))

А теперь выведите result to text и попробуйте найди эти два пробела.

уже проверил) извиняюсь. Просто задача у ТС нетривиальная, интересно :)
5 июн 13, 18:00    [14396345]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей Викт.
Просто задача у ТС нетривиальная, интересно :)

Задача ТС называется "синтаксический анализ". С такой постановкой задачи (а точнее, с отсутствием оной постановки) эта задача никогда не будет решена.
5 июн 13, 19:18    [14396643]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Гость333
Сергей Викт.
Просто задача у ТС нетривиальная, интересно :)

Задача ТС называется "синтаксический анализ". С такой постановкой задачи (а точнее, с отсутствием оной постановки) эта задача никогда не будет решена.

Ну почему жею. Очередной "долгострой". По крупинке. Дождёмся ответа от ТС - сделаем ещё и с переходом на другую строку. А потом ещё что-нибудь выплывет. Нормальная ситуация для РФ - работать без ТЗ и не имея четкой постановки.
6 июн 13, 08:40    [14397778]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Вообще-то, я, кажется, перечислял что надо сделать,
чтобы сегодняшним требованиям ТС удовлетворить.

Доктор, меня не замечают! ©
6 июн 13, 10:38    [14398382]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей Викт.
Гость333
пропущено...

Задача ТС называется "синтаксический анализ". С такой постановкой задачи (а точнее, с отсутствием оной постановки) эта задача никогда не будет решена.

Ну почему жею. Очередной "долгострой". По крупинке. Дождёмся ответа от ТС - сделаем ещё и с переходом на другую строку. А потом ещё что-нибудь выплывет.

Вот, если хотите, выплывает:
use tempdb;
create table[prot](x int);
update[prot]set[prot].x=1; -- всё слитно, без всяких пробелов, тем не менее работает
drop table[prot];


А потом выяснится, что надо комментарии обрабатывать. А потом ещё что-нибудь.
6 июн 13, 11:46    [14398838]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Гость333
Вот, если хотите, выплывает:
use tempdb;
create table[prot](x int);
update[prot]set[prot].x=1; -- всё слитно, без всяких пробелов, тем не менее работает
drop table[prot];
Мало того, одним DROPом дропать можно сразу несколько таблиц, перечисленных через запятую!
6 июн 13, 11:55    [14398904]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
iap
Гость333
Вот, если хотите, выплывает:
use tempdb;
create table[prot](x int);
update[prot]set[prot].x=1; -- всё слитно, без всяких пробелов, тем не менее работает
drop table[prot];
Мало того, одним DROPом дропать можно сразу несколько таблиц, перечисленных через запятую!

да и update SET через запятую может быть много полей указано и с пробелами после запятой, и без оных. Поэтому я и сказал, что задача нетривиальная)) Ну или просто хз какая.
6 июн 13, 12:09    [14399030]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / Microsoft SQL Server Ответить