Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL (число прочтений - 6962 )
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #15 - 01. Февраля 2011 :: 15:35
Печать  
vectorov писал(а) 01. Февраля 2011 :: 14:54:
trad писал(а) 01. Февраля 2011 :: 14:41:
Работать с параметризированным datetime/smalldatetime - проблем нет. Если будет нужно подскажем.

Подскажите, пожалуйста.


Цитата:
Цитата:
Цитата(Изучающий 1С @ ++Apr 24 2006, 11:24)
и ещё почему
рс.ДобПараметр(1,10,17,0); //Дата
а не
рс.ДобПараметр(1,10,8,0); //Дата
?

если nLen < 17 то тип smalldatetime
если nLen >= 17 то тип datetime
http://itland.ru/forum//index.php?s=&showtopic=15640&view=findpost&p=82784
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #16 - 01. Февраля 2011 :: 15:38
Печать  
vectorov писал(а) 01. Февраля 2011 :: 14:54:
В моем случае это поле обеспечивает версионность набора данных, вставляемых из ТЗ, поэтому getdate не подходит

Ну так если это для версионности, то ему правильнее быть identity.
... и можно даже оставаться бигинтом.
это во-первых.

во-вторых
твое
Число(Формат(ТекущаяДата(),"ДГГГГММДД")+СтрЗаменить(ТекущееВремя(),":",""));
ничем не лучше getdate()

в-третьих
если все же хочется иметь "временнУю" и в то же время безопасную версионность, то лучшим, на мой взгляд будет


INSERTDATE smalldatetime NOT NULL DEFAULT (getdate()),
ROW_ID int IDENTITY (1, 1) NOT NULL
  

1&&2&&3
Наверх
 
IP записан
 
vectorov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 08. Октября 2010
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #17 - 01. Февраля 2011 :: 16:41
Печать  
Спасибо за всё.
Теперь всё стало понятным.

По поводу identity: не могу я его использовать, так как данные я вставляю в две таблицы (шапка и детали) и мне необходимо иметь ключ для их связки, а identity мне не позволит использовать ВыполнитьSQL_ИзТЗ без изысков программирования.
Или я не прав?
  
Наверх
 
IP записан
 
Mikeware
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 262
Зарегистрирован: 27. Июля 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #18 - 01. Февраля 2011 :: 16:47
Печать  
Тема как по заказу.есь день бъюсь со вставкой времени в ВыполнитьSQL_ИзТЗ...
В таблице есть поля - типа datetime,  туда нужно вставить _время_
Пытаюсь в ТЗ записать дату и время строкой, и оттуда выполнить запрос с преобразованием типа:
INSERT
      D__CARS_IMP
     (ACTIVE ,NAME ,MARK ,QUANT ,MAX_LEN ,MAX_TIME ,MAX_NUM, NOMER, START_TIME, CLOSE_TIME
     ,DRIVER_ID, RENTED, MAX_SUM1, MAX_SUM2, UNLOAD_TYP, CATEGORY_ID, EXT_STRID, STR1, STR2, STR3
     ,INT1,INT2,INT3,DISP_ID)
     VALUES(?, ?, ?, ?, ?
,convert(datetime ,? )
,? ,?,cast(? аs datetime) ,cast(? аs datetime) ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? , ?, ?)
Ну и получаю либо "недопустимый формат времени", либо ошибку в параметрах...
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #19 - 01. Февраля 2011 :: 18:14
Печать  
vectorov писал(а) 01. Февраля 2011 :: 16:41:
По поводу identity: не могу я его использовать, так как данные я вставляю в две таблицы (шапка и детали) и мне необходимо иметь ключ для их связки, а identity мне не позволит использовать ВыполнитьSQL_ИзТЗ без изысков программирования.
Или я не прав?

Прав в общем то.
Единственный, как я вижу, путь для использования identity - это уйти от ВыполнитьSQL_ИзТЗ.
Т.е. устанавливать параметры вручную, выполнять вставку в шапку. Получать @@IDENTITY. Использовать его для вставки в детали.
минус - менее эффективная передача параметров на сервер.
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #20 - 01. Февраля 2011 :: 18:27
Печать  
Mikeware

для cast(? аs datetime) в ТЗ должна быть строка вида: 2011-02-01 21:11:35.513 можно без миллисекунд. (чтобы это потом вспомнить - пиши select getdate())
и ДобПарам(1,14,23,0) или ДобПарам(1,14,19,0)
  

1&&2&&3
Наверх
 
IP записан
 
Mikeware
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 262
Зарегистрирован: 27. Июля 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #21 - 01. Февраля 2011 :: 20:30
Печать  
trad писал(а) 01. Февраля 2011 :: 18:27:
и ДобПарам(1,14,23,0) или ДобПарам(1,14,19,0)

а разве для ВыполнитьИзТЗ - нужны ДобПараметр()?
разве не автоматом строятся?
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #22 - 02. Февраля 2011 :: 05:45
Печать  
Если не добавлено ни одного параметра, то они строятся автоматом.
Но лучше это делать самому.
  

1&&2&&3
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #23 - 02. Февраля 2011 :: 06:01
Печать  
trad писал(а) 01. Февраля 2011 :: 18:14:
vectorov писал(а) 01. Февраля 2011 :: 16:41:
По поводу identity: не могу я его использовать, так как данные я вставляю в две таблицы (шапка и детали) и мне необходимо иметь ключ для их связки, а identity мне не позволит использовать ВыполнитьSQL_ИзТЗ без изысков программирования.
Или я не прав?

Прав в общем то.
Единственный, как я вижу, путь для использования identity - это уйти от ВыполнитьSQL_ИзТЗ.
Т.е. устанавливать параметры вручную, выполнять вставку в шапку. Получать @@IDENTITY. Использовать его для вставки в детали.
минус - менее эффективная передача параметров на сервер.

Можно еще покопать на предмет хранимой процедуры, типа, укладываем записываемые данные во временную таблицу, запускаем хранимую процедуру, которая по этим данным делает нужные инсерты, получает идентити, и т.д.
Вот, например, как у меня работает (там правда не идентити, а свои заморочки):
Код
Выбрать все
CREATE PROCEDURE [dbo].[CD_Update]
	@MyDate datetime,
	@MyDoc varchar(13),
	@Post varchar(9)
AS
DECLARE @SQLError int
SET @SQLError=0
BEGIN TRANSACTION
	--формируем список товаров на изменение
	SELECT Tovar, Date_T, iddoc_T,Active INTO #tmpCD_Update FROM CenaDogovor Where Date_F<=@MyDate and Date_T>@MyDate and Tovar in (SELECT Tovar from #tmpCenaDogovor) and Post=@Post
SET @SQLError=@@ERROR
IF @SQLError<>0 GOTO Error
	SELECT C.Tovar, Min(C.Date_F) as MinD, Min(CD.iddoc_f) as iddoc_f INTO #tmpMinCD_Update FROM CenaDogovor C LEFT JOIN CenaDogovor CD ON C.Tovar=CD.Tovar AND C.iddoc_f=CD.iddoc_f
		Where C.Tovar in (SELECT Tovar from #tmpCenaDogovor) and C.Post=@Post GROUP BY C.Tovar
SET @SQLError=@@ERROR
IF @SQLError<>0 GOTO Error
	--изменяем конечную дату по этому списку
	Update CenaDogovor SET Date_T=@MyDate, iddoc_T=@MyDoc  Where Date_F<=@MyDate and Date_T>@MyDate and Tovar in (SELECT Tovar from #tmpCD_Update) and Post=@Post
SET @SQLError=@@ERROR
IF @SQLError<>0 GOTO Error
	--добавляем новые строки
	insert into CenaDogovor select Date_F,'99990101',Tovar,Post,iddoc_F,'',Cena,ProcPlus,ProcMinus,Active from #tmpCenaDogovor
SET @SQLError=@@ERROR
IF @SQLError<>0 GOTO Error
	--изменяем конечную дату по этому списку
	Update CenaDogovor SET Date_T=t.Date_T, iddoc_T=t.iddoc_T From #tmpCD_Update t Where iddoc_F=@MyDoc and CenaDogovor.Tovar=t.Tovar
	Update CenaDogovor SET Date_T=t.MinD, iddoc_T=t.iddoc_f From #tmpMinCD_Update t Where CenaDogovor.iddoc_F=@MyDoc and CenaDogovor.Tovar=t.Tovar and Date_F<MinD
Error:
DROP TABLE #tmpCenaDogovor
DROP TABLE #tmpCD_Update
DROP TABLE #tmpMinCD_Update
IF @SQLError=0
  BEGIN
    COMMIT TRANSACTION
  END
ELSE
  BEGIN
    ROLLBACK TRANSACTION
  END

GO
 


  
Наверх
ICQ  
IP записан
 
vectorov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 08. Октября 2010
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #24 - 02. Февраля 2011 :: 07:41
Печать  
trad писал(а) 02. Февраля 2011 :: 05:45:
Если не добавлено ни одного параметра, то они строятся автоматом.
Но лучше это делать самому.


А можно добавлять только именованные параметры, а остальные автоматом будут определяться, то есть добавил один параметр, значит надо добавлять все остальные?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #25 - 02. Февраля 2011 :: 07:55
Печать  
vectorov писал(а) 02. Февраля 2011 :: 07:41:
то есть добавил один параметр, значит надо добавлять все остальные?
именно так
  

1&&2&&3
Наверх
 
IP записан
 
Mikeware
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 262
Зарегистрирован: 27. Июля 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #26 - 03. Февраля 2011 :: 05:32
Печать  
Добавил параметры.
в ТЗ должна были строки вида как : 2011-02-01 21:11:35.513, так и 2011-02-01 21:11:35, колонки ТЗ были, соответственно, Строка  23 и Строка 19 параметры, соответственно,  ставил ДобПарам(1,14,23,0) / ДобПарам(1,14,19,0) - все равно "Недопустимый формат"
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #27 - 03. Февраля 2011 :: 06:22
Печать  
проверил
Код
Выбрать все
рс=СоздатьОбъект("ODBCRecordset");
рс.ВыполнитьИнструкцию("
|if exists (select * from tempdb..sysobjects where id = object_id('tempdb..#tmp1'))
|  drop table #tmp1
|create table #tmp1 (
|  f1 datetime not null
|)
|");

рс.ВыполнитьИнструкцию("insert into #tmp1 (f1) values (getdate())");

рс.Подготовить("insert into #tmp1 (f1) values (?)");
рс.ДобПараметр(1,10,17,0);
рс.УстПараметр(1,ТекущаяДата());
рс.ВыполнитьИнструкцию();

рс.Подготовить("insert into #tmp1 (f1) values (cast(? as datetime))");
рс.ДобПараметр(1,14,23,0);
рс.УстПараметр(1,"2011-02-01 21:11:35.513");
рс.ВыполнитьИнструкцию();

ТЗ=рс.ВыполнитьИнструкцию("select f1 [Поле $Строка] from #tmp1");
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
    Сообщить(ТЗ.Поле);
КонецЦикла;
 


получил
2011-02-03 09:04:25.083
2011-02-03 00:00:00.000
2011-02-01 21:11:35.513
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #28 - 03. Февраля 2011 :: 06:23
Печать  
когда копипастил твое выражение
cast(? аs datetime)
заметил что а - кириллическая
, но ошибка д.б. Incorrect syntax near 'аs'.
  

1&&2&&3
Наверх
 
IP записан
 
Mikeware
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 262
Зарегистрирован: 27. Июля 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #29 - 03. Февраля 2011 :: 14:02
Печать  
trad писал(а) 03. Февраля 2011 :: 06:22:

Я исполнял запрос с помощью ВыполнитьSQLИзТЗ
поэтому параметры добавлял, но не устанавливал.
в тз тип данных - Строка.
В принципе, сделал обычным запросом в цикле. работает. Но некрасиво, конечно...
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать