Конференция "Базы" » sql server, оператор output и adoDataSet [D7, MSSQL]
 
  • kile © (28.10.08 22:08) [0]
    подскажите, кто по опотнее

    sql server 2005
    таблица:
     table_1 (
        id int IDENTITY(1,1) NOT NULL,
        name varchar(50) )

    Delphi 7, в ADOQuery:
        insert into table_1(name) output inserted.id values('qwerty')

    При первом запуске ADOQuery срабатывает как и нужно -добавляет запись и возврашает строку со значением id.
    При повторном запуске: EOLEException: "Ошибка подключения"

    Что может быть?
  • Ega23 © (29.10.08 13:48) [1]

    > insert into table_1(name) output inserted.id values('qwerty')


    Первый раз такую конструкцию вижу. Даже и не знал, что так можно. Обычно делаю так:

    Set NoCount ON
    insert into table_1(name) values('qwerty')
    Select Result = Scope_Identity()



    Ну и выполняешь это дело через Open, далее либо
    FieldByName('Result').AsInteger

    либо
    Fields[0].AsInteger



    А если ещё точнее, то это дело в хранимку оборачиваю. Но это уже отдельная тема.
  • Anatoly Podgoretsky © (29.10.08 16:27) [2]
    Это синтаксис 2005, зато inserted.id это не скаляр и вся конструкция по сути является ошибкой.
  • stas © (29.10.08 17:07) [3]
    kile ©   (28.10.08 22:08)
    Интересно ты придумал получать ID, лучше как в Ega23 ©   (29.10.08 13:48) [1]

    Ega23 ©   (29.10.08 13:48) [1]
    OUTPUT INTO иногда даже полезна, просто OUTPUT даже незнаю где и применить можно.
  • Ega23 © (29.10.08 17:26) [4]

    > OUTPUT INTO иногда даже полезна, просто OUTPUT даже незнаю
    > где и применить можно.


    Ты сам себе противоречишь....  :)))
  • stas © (29.10.08 17:27) [5]
    Ega23 ©   (29.10.08 17:26) [4]
    Почему ? :)
  • Ega23 © (29.10.08 17:28) [6]
    Или ты не знаешь, как голый output применить?
  • stas © (29.10.08 17:34) [7]
    Ega23 ©   (29.10.08 17:28) [6]
    голый output выведет список удаленны/измененных/добавленых записей и что с ними делать?
    Если вставить в таблицу это понятно, можно дальше с ними работать.
  • b z (29.10.08 18:00) [8]

    > голый output выведет список удаленны/измененных/добавленых
    > записей и что с ними делать?
    Например: данные в полях могут инициализироваться/изменяться не только на клиенте, а клиенту почти всегда нужно/желательно/... знать актуальные данные.
  • kile © (29.10.08 20:47) [9]

    >А если ещё точнее, то это дело в хранимку оборачиваю.


    Объясните, плис, зачем создавать хранимую процедуру, если скрипт ниже норм выполняется в adoquery и идентификатор возвращает:

    Set NoCount ON
    insert into table_1(name) values('qwerty')
    Select Result = Scope_Identity()

  • sniknik © (29.10.08 21:52) [10]
    есть у некоторых такая мания все подряд в них "оборачивать"... ;)

    встречал, в таком солидном с виду продукте...  типа
    CREATE PROCEDURE GetDoc
    AS
     SELECT * FROM ViewDoc

    и соответственно вьюшка
    CREATE VIEW ViewDoc
    AS
     SELECT * FROM Documents

    и права только на использование GetDoc... ни к вьюшке ни к таблице доступа нет по умолчанию, таблица справочник может быть довольно большой, а используют его раз прав нет, понятно как, выборкой всего и фильтрацией на клиенте... что подтвердилось тормозами, когда я туда 5 млн записей нагенерил... (тестю я так программы разные :)
  • stas © (30.10.08 08:52) [11]
    kile ©   (29.10.08 20:47) [9]
    Допустим у пользователя нет прав вставлять данные в таблицу, а вот именно name только из этой хранимки можно.
  • Ega23 © (30.10.08 12:15) [12]

    > есть у некоторых такая мания все подряд в них "оборачивать".
    > .. ;)


    TSQL, в отличие от других, более "вольно" относится к хранимым процедурам. Поэтому ничего не стоит написать хп для работы с сущностью. Типа:


    Print  'S_TBLK - процедура для работы с БЛК-блоками'
    go
    if exists (select * from sysobjects where id = object_id(N'[S_TBLK]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [S_TBLK]
    GO
    CREATE PROCEDURE S_TBLK

    @ActNam varchar(32)='NONE',
    @ObjID int=-1,
    @ObjOwner int =NULL,
    @ObjNam varchar(64)='',
    @ObjLab varchar(64)='',
    @ObjOrd int =-1,
    @ObjMsk tinyint =255,
    @ObjNot varchar(255)='',
    @ObjStat int =0,
    @LogAddr int =-1,
    @PhsAddr int =-1,
     @SubAddr int =0,
    @LogObjID int =NULL,
    @PhsCfgTypCod int =NULL,

    -- Debug Information
    @SelOut int =1,
     @Debug int =0

    As
    declare  
     @result int,
     @ConstCLSID int,
     @x int;

    Set NoCount ON;
    Set @ConstCLSID=31300;
    Set @Result=0;
    Select @ActNam=RTrim(LTrim(UPPER(@ActNam)));

    --------------------------------------------------------------------------------------------------------------

    if @ActNam='SEL'
    begin
     Select *,
       ObjMskStr=Case when ObjMsk=0 then 'Нет' else 'Да' end
     from BLK
     where (@ObjMsk=255 or ObjMsk=@ObjMsk) and (@ObjID=-1 or ObjID=@ObjID)
       
     Order By ObjOrd;
    Goto Fin;
    end;

    --------------------------------------------------------------------------------------------------------------

    if @ActNam='ADD'
    begin

     exec @ObjID=S_RTTIProc @ActNam='GETOBJID.SEL', @CLSID=@ConstCLSID, @ObjID=@ObjID;

    -- exec S_LogToPhsLinkProc @ActNam='PHSTOLOG.SET', @ObjID=@ObjID, @LogObjID=@LogObjID output;

    Insert into BLK
              (ObjID, ObjOwner, ObjNam, ObjLab, ObjOrd, ObjMsk, ObjNot, ObjStat,
              LogAddr, PhsAddr, SubAddr, LogObjID, PhsCfgTypCod)
          Values (@ObjID, @ObjOwner, @ObjNam, @ObjLab, @ObjOrd, @ObjMsk, @ObjNot, @ObjStat,
              @LogAddr, @PhsAddr, @SubAddr, @LogObjID, @PhsCfgTypCod);

    exec S_RTTIProc @ActNam='SETPOINTID.UPD', @ObjID=@ObjID, @LogAddr=@LogAddr, @PhsAddr=@PhsAddr;

    Select @Result=@ObjID;
    if @SelOut=1
     begin
     Set NoCount OFF;
     Select Result=@Result;
     end;

    Goto Fin;
    end;

    --------------------------------------------------------------------------------------------------------------

    if @ActNam in ('UPD', 'UPDALL')
    begin

    -- exec S_LogToPhsLinkProc @ActNam='PHSTOLOG.SET', @ObjID=@ObjID, @LogObjID=@LogObjID output;

    Update BLK set
        ObjNam=@ObjNam, ObjOwner=@ObjOwner, ObjLab=@ObjLab, ObjOrd=@ObjOrd,
        ObjMsk=@ObjMsk, ObjNot=@ObjNot, ObjStat=@ObjStat,
        LogAddr=@LogAddr, PhsAddr=@PhsAddr, SubAddr=@SubAddr, LogObjID=@LogObjID,
        PhsCfgTypCod=@PhsCfgTypCod

     where ObjID=@ObjID;

    exec S_RTTIProc @ActNam='SETPOINTID.UPD', @ObjID=@ObjID, @LogAddr=@LogAddr, @PhsAddr=@PhsAddr;

    Select @Result=@ObjID;
    if @SelOut=1
     begin
     Set NoCount OFF;
     Select Result=@Result;
     end;

    Goto Fin;
    end;

    --------------------------------------------------------------------------------------------------------------

    if @ActNam='DEL'
    begin

    -- exec S_LogToPhsLinkProc @ActNam='PHSTOLOG.SET', @ObjID=@ObjID, @LogObjID=NULL;
     Delete BLK where ObjID=@ObjID;
    Delete ObjectClasses where ObjID=@ObjID;

    Select @Result=@ObjID;
    if @SelOut=1
     begin
     Set NoCount OFF;
     Select Result=@Result;
     end;

     Goto Fin;
    end;

    --------------------------------------------------------------------------------------------------------------

    fin:
    set nocount off;
    return(@result);
    GO


 
Конференция "Базы" » sql server, оператор output и adoDataSet [D7, MSSQL]
Есть новые Нет новых   [134477   +39][b:0][p:0.003]