-
Юрий Зотов © (21.11.16 00:50) [0]Delphi 7, двузвенка, сервер MS SQL.
ADO настроен.
В BDE имеетсяалиас для этого ADO (назовем его MyAlias).
Есть TQuery (по ряду причин не TADOQuery, а именно TQuery).
В этом TQuery прописано DatabaseName = 'MyAlias'
В этом TQuery поля в design-time не созданы.
Авторизация любая (хоть серверная, хоть системная).
Права админа БД.
Задача: получить текущий логин.
1. В качестве теста выполняю в TQuery запрос:select * from v
(где v - вьюха с 2-мя полями и 2-мя записями)
Результат: все отлично.
2. Меняю запрос:select user_name() as un from v
(где user_name - встроенная фукция, дающая текущий логин)
Результат: сообщений об ошибках нет, но в TQuery не появляется ни одного поля.
3. Снова меняю запрос:select fld, user_name() as un from v
(где fld - одно из полей вьюхи v)
Результат: сообщений об ошибках нет, но в TQuery появляется только поле fld, а поле un отсутствует.
Вопросы (гугль не помог):
а). почему не создается поле для функции user_name?
б). что делать? -
Юрий Зотов © (21.11.16 01:04) [1]Уточнение: сервер MS SQL 2005 Express Edition
-
Юрий Зотов © (21.11.16 01:56) [2]Уточнение по п.п. 2 и 3.
Хотя поле не создается, TQuery, как и должно быть, содержит 2 записи (столько, сколько и есть во вьюхе V). Как получается 2 записи и ни одного поля (п.2) - для меня загадка. -
ухты_х © (21.11.16 03:04) [3]для чего запросе вьюха?
-
iop © (21.11.16 08:32) [4]видимо бде не умеет nvarchar(255)
-
iop © (21.11.16 09:32) [5]для чего запросе вьюха?
для проверки тово, что на сервере запрос выполнился и в нем есть строки -
Юрий Зотов © (21.11.16 10:00) [6]> iop
Спасибо. После Вашей подсказки все стало ясно. Вот так работает:select cast(suser_sname() as varchar(128)) as un from ...
-
ухты_х © (21.11.16 12:17) [7]
> для проверки тово, что на сервере запрос выполнился и в
> нем есть строки
зачем для этого вьюху делать.. ну да ладно, проехали) -
iop © (21.11.16 12:43) [8]два запроса.
первый в бде виден отлично, второй в бде горбит.
теперь выполняем их вместе и видим,
что выборка есть и в ней две строки как у первого запроса, но нет поля из второго.
вывот:
1. user_name() "не портит" запрос на сервере и с самой по себе функцией все в порядке.
2. так как поля не видно, собака зарылась в клиентской библиотеке.
логика называется это. -
ухты_х © (21.11.16 12:59) [9]я не про то
выполни простой запрос вида
select '123', N'123' и смотри на логику ... -
iop © (21.11.16 13:16) [10]ну выполнили запрос. а там пусто.
и в чем дело?
в том что это бде или в том что user_name() ? -
iop © (21.11.16 13:18) [11]и вьюха создавалась не доля проверки, а для надо.
и mssql сервер ставился не для проверки. -
ухты_х © (21.11.16 13:34) [12]ну хорошо что во вьюхе не проскачил юникод или еще какие хитрости, а если бы не так удачно сложилось?
> и в чем дело?
> в том что это бде или в том что user_name() ?
или еще что?
я потому и спросил, зачем тут вьюха, потому что для получения имени (1 раз) принимать 2 и более строки - смысла нет.
что вы пытаетесь доказать мне не понятно) -
iop © (21.11.16 13:37) [13]Удалено модератором
-
iop © (21.11.16 13:40) [14]выполни простой запрос вида
select '123', N'123' и смотри на логику ...
зачем здесь один два три?
выполни простой запрос
select 4
и смотри на логику -
ухты_х © (21.11.16 13:34) [12]
В принципе прав. зачем дублировать username столько раз сколько записей во вьюхе ?select cast(suser_sname() as varchar(128)) as un -
iop © (21.11.16 13:45) [16]Удалено модератором
-
Удалено модератором
-
Юрий Зотов © (21.11.16 13:54) [18]1. Вьюха "штатная", специально для теста она не создавалась, а только была использована.
2. В тесте на дублирование можно наплевать. Суть не в нем, а в том, чтобы создалось поле.
3. В "боевом" запросе дублирования, конечно, нет. -
Inovet © (23.11.16 22:42) [19]Юра, первое, что пришло в голову, - сделать кастинг. Мало ли какие особенности у BDE.
Советовать не стал - ввиду очевидности такой проверки и неуверенности в диагнозе, а разыорачивать BDE для моделирования, не хотелось. Но получилось именно так, что намекает - иногда наступаешь в такие грабли, что сразу и не увидишь. -
Inovet © (23.11.16 22:56) [20]Сам факт занятный - вообще-то не должно возвращаться нулевое количество полей.