Skip to Content
0

Problem (in my opinion) whith double quotas in identifiers.

Jan 25 at 01:04 PM

98

avatar image
Former Member

SAP SQL Anywhere 16.0.0.2043 have a problem (in my opinion) whith double quotas in identifiers:

My example:
ISQL. Run Script:
CREATE TABLE DBA.TestTable(
ID integer NOT NULL
,Amount integer NOT NULL CONSTRAINT TestTableAmount check(Amount > 0)
,Name varchar(40) NOT NULL
,PRIMARY KEY (ID ASC)
)

In Sybase Central I open:
Tables --> TestTable --> Constraints --> TestTableAmount --> Definition --> check("Amount" > 0).

Why there were double quotes in the variable Amount --> "Amount" ?
In previous versions (10 and earlier) of this was not.

The analysis of quotes in identifiers inhibits the work of the sql-server.
I never use quotation marks in identifiers.
They very much interfere with writing programs.
This really hinders the normal perception of the text of programs.
Solve, please this problem or at least think about it.
In fact, this is a very serious and global problem.

Maybe something has already been fixed, but I do not have access to download updates.
Sorry for my English.
My native language is russian.

10 |10000 characters needed characters left characters exceeded
Лев,

Приведите пожалуйста более конкретный пример того, где это вызывает неудобство? Последующий пример использования Amount без кавычек возвращает правильный результат:

insert into TestTable(ID, Amount,Name) values (1, 1, 't2');
insert into TestTable(ID, Amount,Name) values (2, 2, 't2');
select * from testTable;
select * from testTable where Amount > 1;

0
Former Member

Добрый день, Евгения.

Привожу пример:

SQL-текст в версии SQL Anywhere 10.0.1, который хранит SQL-текст без кавычек:
check((SubStr(NumAutoclaveGrill,1,3) = 'НЕТ') or
(Abs(cast(SubString(NumAutoclaveGrill,1,Length(NumAutoclaveGrill)-
(if "Right"(NumAutoclaveGrill,1) in( 'А') then 1 else 0
endif)) as smallint)) between 1 and 1000)).

SQL-текст в версии SAP SQL Anywhere 16, который хранит SQL-текст с кавычками:
check(("SubStr"("NumAutoclaveGrill",1,3) = 'НЕТ') or
("Abs"(cast("SubString"("NumAutoclaveGrill",1,"Length"("NumAutoclaveGrill")-
(if "Right"("NumAutoclaveGrill",1) in( 'А' ) then 1 else 0 endif)) as smallint))
between 1 and 1000))

Такой текст как в последнем абзаце мной, как программистом, воспринимается "ужасно",
(т.е. очень неудобный для восприятия текст, т.е. текст, который надо анализировать и над которым надо думать),
что обязательно скажется на моей работоспособности, поверьте моему опыту.
Прежде чем дать имя переменной я буду долго думать и придумаю подходящее на
английском языке. Зато потом с такой переменной (т.е. по SQL-документации идентификатор, identifier)
мне удобно работать, т.к. я смотрю на нее по несколько часов в день.
Но если в тексте программы будет столько кавычек (порядка 20 в вышеприведенном абзаце),
то их созерцание и написание (написание м.б. и нет, т.к. SQL Anywhere 16 сам их добавляет),
а также постоянные мысли об этой "особенности" (feature) SQL-сервера будет постоянным стрессом в моей работе.
Когда я долго смотрю на текст программы, то он как бы отпечатывается в моей зрительной памяти.
Я потом могу думать о каком-то сложном моменте в написании процедур или вот этих констрейнтов,
представляя в памяти текст программы. И кавычки в этом тексте совершенно не к месту.
Они явно мешают моему нормальному целостному зрительному восприятию текста программы.
(А для чего тогда язык верхнего уровня?)
Кавычки сильно отвлекают мое внимание от того, чтобы погрузиться в смысл самой процедуры.
Я уже не говорю о том, что SQL-серверу постоянно нужно обрабатывать эти
кавычки, включать и исключать их из идентификаторов.
Я не могу понять, зачем нужно хранить SQL-текст с закавыченными идентификаторами.
Я посмотрел, что и View SQL Anywhere 16 хранит с кавычками (SYSTABLE.View_defn).

Вот еще пару примеров для полноты картины:
SQL Anywhere 10.0.1: check(exists(select * from STA.ProdTree where((KodDown = Prod) and(KodUp in( 2000,2400,3000,3901,4000,4701,4720,10000,11000) ) or(Prod in(2810,4800))))) SAP SQL Anywhere 16: check(exists(select * from "STA"."ProdTree" where(("KodDown" = "Prod") and("KodUp" in( 2000,2400,3000,3901,4000,4701,4720,10000,11000)) or("Prod" in(2810,4800))))) Ещё пример: Without quotes: check((((Tare is not null) and exists(select * from STA.UnForming1 as A where(A.ID = IDH) and(ForemanPackage is not null))) or(Tare is null)) and((AmountLine14 is not null) or(AmountLine2 is not null))) With quotes: check(((("Tare" is not null) and exists(select * from "STA"."UnForming1" as "A" where("A"."ID" = "IDH") and("ForemanPackage" is not null))) or ("Tare" is null)) and (("AmountLine14" is not null) or("AmountLine2" is not null))) Without quotes: check(((Prod in( 4702,4703,4704,4705)) and(Movement = 2)) or ((Prod in(4721,4722,4723,4724)) and(Movement = 3)) or not(Prod in(4702,4703,4704,4705,4721,4722,4723,4724))) With quotes: check((("Prod" in( 4702,4703,4704,4705)) and("Movement" = 2)) or (("Prod" in(4721,4722,4723,4724)) and("Movement" = 3)) or not("Prod" in(4702,4703,4704,4705,4721,4722,4723,4724)))

Евгения, спасибо за внимание к изложенной проблеме.
With best regards.
Lev Zusman.

0

Лев,

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

С уважением,
Евгения

0
* Please Login or Register to Answer, Follow or Comment.

2 Answers

Evgeniya Vashkevich
Feb 28 at 09:10 PM
0

Hi Lev,

We introduced this behavior in version 16 for consistency purposes and it is present in version 17. So far, we do not have an intend to change it back, but our development team did look into that. Unfortunately, they could not find a way that will allow you to disable it.

Regards,
Evgeniya

Share
10 |10000 characters needed characters left characters exceeded
Volker Barth Mar 01 at 08:22 AM
0
This really hinders the normal perception of the text of programs.

Lev, can you explain why that change does make "programming SQL" for you more difficult?

I do also not like this change, and I also do never user identifiers that would need quotes to be valid.

However, I use the code exactly as I have written myself and do not rely on the output of SQL Central. So, say for procedures/triggers, my original (and therefore unquoted) code is stored in the "source" columns of the according system tables like "SYSPROCEDURE". (And additionally in source code management tools.)

Share
10 |10000 characters needed characters left characters exceeded