Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];

Вниз

sql server, оператор output и adoDataSet   Найти похожие ветки 

 
kile ©   (2008-10-28 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 ©   (2008-10-29 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 ©   (2008-10-29 16:27) [2]

Это синтаксис 2005, зато inserted.id это не скаляр и вся конструкция по сути является ошибкой.


 
stas ©   (2008-10-29 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 ©   (2008-10-29 17:26) [4]


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


Ты сам себе противоречишь....  :)))


 
stas ©   (2008-10-29 17:27) [5]

Ega23 ©   (29.10.08 17:26) [4]
Почему ? :)


 
Ega23 ©   (2008-10-29 17:28) [6]

Или ты не знаешь, как голый output применить?


 
stas ©   (2008-10-29 17:34) [7]

Ega23 ©   (29.10.08 17:28) [6]
голый output выведет список удаленны/измененных/добавленых записей и что с ними делать?
Если вставить в таблицу это понятно, можно дальше с ними работать.


 
b z   (2008-10-29 18:00) [8]


> голый output выведет список удаленны/измененных/добавленых
> записей и что с ними делать?
Например: данные в полях могут инициализироваться/изменяться не только на клиенте, а клиенту почти всегда нужно/желательно/... знать актуальные данные.


 
kile ©   (2008-10-29 20:47) [9]


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


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

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


 
sniknik ©   (2008-10-29 21:52) [10]

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

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

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

и права только на использование GetDoc... ни к вьюшке ни к таблице доступа нет по умолчанию, таблица справочник может быть довольно большой, а используют его раз прав нет, понятно как, выборкой всего и фильтрацией на клиенте... что подтвердилось тормозами, когда я туда 5 млн записей нагенерил... (тестю я так программы разные :)


 
stas ©   (2008-10-30 08:52) [11]

kile ©   (29.10.08 20:47) [9]
Допустим у пользователя нет прав вставлять данные в таблицу, а вот именно name только из этой хранимки можно.


 
Ega23 ©   (2008-10-30 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




Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.125 c
15-1243883957
Petr V. Abramov
2009-06-01 23:19
2009.08.02
посоветйте клиент аськи


3-1225350632
prisoner849
2008-10-30 10:10
2009.08.02
Как проапдейтить определенное поле в таблице?


15-1243701266
pushkin42
2009-05-30 20:34
2009.08.02
IBX SQL протокол


15-1242296673
Sergey Masloff
2009-05-14 14:24
2009.08.02
Ну вот и привет зрению... :(


2-1244397306
MADMAN
2009-06-07 21:55
2009.08.02
Помогите с SQL запросом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский