Конференция "Базы" » Не создается поле для результата функции [D7, MSSQL]
 
  • Юрий Зотов © (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
    и смотри на логику
  • stas © (21.11.16 13:41) [15]
    ухты_х ©   (21.11.16 13:34) [12]
    В принципе прав. зачем дублировать username столько раз сколько записей во вьюхе ?
    select cast(suser_sname() as varchar(128)) as un

  • iop © (21.11.16 13:45) [16]
    Удалено модератором
  • stas © (21.11.16 13:46) [17]
    Удалено модератором
  • Юрий Зотов © (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]
    Сам факт занятный - вообще-то не должно возвращаться нулевое количество полей.
 
Конференция "Базы" » Не создается поле для результата функции [D7, MSSQL]
Есть новые Нет новых   [118667   +48][b:0][p:0.001]