Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQLCMD  [new]
alex171069
Member

Откуда: Новосибирск
Сообщений: 281
Доброго времени суток!
Кто работал с этой утилитой?
Ситуация следующая ....
Эта утилита читает скрипт .sql
В котором создаются хранимки и таблицы...
Первый вариант этого скрипта отработал на ура .
Но я дописал в этот скрипт создать еще одну хранимку ... и тут
началось ... эта новая хранимка не создается в базе, что я не предпринимал..
Я тут подумал может кэш сервера виноват ?
Кто с подобным сталкивался прошу откликнуться ...
7 дек 15, 07:41    [18521874]     Ответить | Цитировать Сообщить модератору
 Re: SQLCMD  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
Может ошибка есть какая нибудь чтобы не гадать, а то кофе нет рядом?
или код скрипта покажите, что вы там дописали.
7 дек 15, 09:18    [18522075]     Ответить | Цитировать Сообщить модератору
 Re: SQLCMD  [new]
Glory
Member

Откуда:
Сообщений: 104751
alex171069
Я тут подумал может кэш сервера виноват ?

виноват тот, кто не тестирует свой код, не мониторит его выполнение и не читает сообщений об ошибках
7 дек 15, 09:38    [18522156]     Ответить | Цитировать Сообщить модератору
 Re: SQLCMD  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
alex171069,

причем тут кэш сервера?
Ошибка то какая?

Предположение:
Вы скрипт выполнили, объекты создались.
Добавили ХП, пытаетесь выполнить - скрипт валится с ошибкой, что такие объекты уже есть.
7 дек 15, 09:51    [18522242]     Ответить | Цитировать Сообщить модератору
 Re: SQLCMD  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
alex171069
Кто с подобным сталкивался прошу откликнуться ...
Со своими ошибками тут все сталкивались :-)

Для начала нужно ошибку прочитать. Наверняка в тексте ошибки будет хорошая подсказка :-)
7 дек 15, 09:54    [18522268]     Ответить | Цитировать Сообщить модератору
 Re: SQLCMD  [new]
alex171069
Member

Откуда: Новосибирск
Сообщений: 281
Вот код который я дописал.


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[InsertCommConGT4]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'Create procedure [dbo].[InsertCommConGT4]
@ID int = Null, -- ID
@IDClass int = 1770, -- Класс
@Caption char(50) = Null, -- Заголовок
@State tinyint = 1, -- Статус
@ChangeDate datetime = Null, -- Дата изменения
@CreateDate datetime = Null, -- Дата создания
@Condition int = 184, -- Состояние
@ConditionTime datetime = Null, -- Время состояния
@Number smallint = Null, -- Номер модуля
@IDDevice int = Null, -- Прибор
@Address int = Null, -- Адрес
@Identificator int = Null, -- Идентификатор
@TestInterval tinyint = 60, -- Тестовый интервал
@StrictCheck tinyint = 0 -- Дополнительный параметр: строгая проверка внешних ключей и значений на null
as
begin
-- Начинаем транзакцию
begin transaction CreateCommConGT4
begin try
-- Генерируем уникальные значения идентификаторов
set @ID = [dbo].[InitEntityID]() ; if @ID = -1 goto Failure
set @Number = [dbo].[InitCommunicatorNumber](@IDDevice) ; if @Number = -1 goto Failure
set @Identificator = [dbo].[InitCommConIdentificator]() ; if @Identificator = -1 goto Failure
-- Значения по умолчанию, зависимые от внешних ключей
-- Если предписана строгая проверка
if @StrictCheck = 1
begin
-- Устанавливаем значения по умолчанию
set @State = IsNull(@State, 1)
set @Condition = IsNull(@Condition, 184)
set @ConditionTime = IsNull(@ConditionTime, GetDate())
set @TestInterval = IsNull(@TestInterval, 60)
end
-- В последнюю очередь присваиваем значения вычисляемым полям
Declare @IDDevice_view varchar(50); Select @IDDevice_view = RTrim([Entity].[Caption]) from [Entity] where [Entity].[ID] = @IDDevice
set @Caption = Right(''00'' + cast(@Number as varchar(3)),3) + '' '' + [dbo].[GetClassCaption](@IDClass) + '' ['' + RTrim(@IDDevice_view) + '']''
set @ChangeDate = GetDate()
set @CreateDate = GetDate()
set @Address = 0
-- Вставляем записи в соответствующие таблицы класса
Insert into [Entity] ([ID], [IDClass], [Caption], [State], [ChangeDate], [CreateDate], [Condition], [ConditionTime]) values (@ID, @IDClass, @Caption, @State, @ChangeDate, @CreateDate, @Condition, @ConditionTime)
Insert into [Module] ([ID], [Number], [IDDevice], [Address]) values (@ID, @Number, @IDDevice, @Address)
Insert into [Communicator] ([ID], [Identificator], [TestInterval]) values (@ID, @Identificator, @TestInterval)
-- Зависимые элементы
declare @i int, @ret int
set @i = 0
while @i < 1 -- GSM: 1
begin
set @i = @i + 1
execute @ret = [dbo].[InsertChannelGSM] @IDModule = @ID
if @ret = -1 goto Failure
end
-- Транзакция завершена успешно
commit transaction CreateCommConGT4
-- Процедура возвращает значение первичного ключа (айдишник)
return @ID
end try
begin catch
goto Failure
end catch

-- Неудачное завершение транзакции
Failure:
rollback transaction CreateCommConGT4
return -1
end'
END
7 дек 15, 10:26    [18522496]     Ответить | Цитировать Сообщить модератору
 Re: SQLCMD  [new]
alex171069
Member

Откуда: Новосибирск
Сообщений: 281
отдельно в командной строке консольной реализации все работает но из приложения WinForms работает скрипт кроме того что я дописал...
7 дек 15, 10:28    [18522507]     Ответить | Цитировать Сообщить модератору
 Re: SQLCMD  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
alex171069,

дак ошибка то какая?)))
7 дек 15, 10:51    [18522662]     Ответить | Цитировать Сообщить модератору
 Re: SQLCMD  [new]
alex171069
Member

Откуда: Новосибирск
Сообщений: 281
Ошибки нет !!!
Просто Хранимка не создается - хранимка та которую я показал.
Все остальные хранимки создаются!
7 дек 15, 11:34    [18522985]     Ответить | Цитировать Сообщить модератору
 Re: SQLCMD  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8826
Pavel1211,

if @ret = -1 goto Failure 
...
goto Failure 
end catch 

-- Неудачное завершение транзакции
Failure: 
rollback transaction CreateCommConGT4
return -1 
end 


стесняюсь спросить - это что за буйное воображение при обработке ошибки? Второе, а если процедура глюкнет, а в ней останется открытая транзакция при вылете?Что произойдет с rollback transaction CreateCommConGT4?
7 дек 15, 11:36    [18523013]     Ответить | Цитировать Сообщить модератору
 Re: SQLCMD  [new]
alex171069
Member

Откуда: Новосибирск
Сообщений: 281
транзакция тем и хороша, что это атомарная конструкция т.е. не делимая - при исключении транзакция откатится ....
7 дек 15, 11:49    [18523147]     Ответить | Цитировать Сообщить модератору
 Re: SQLCMD  [new]
Ошибки нет111
Guest
alex171069
Ошибки нет !!!
Просто Хранимка не создается - хранимка та которую я показал.
Все остальные хранимки создаются!

в смысле вы направили output sqlcmd в текстовый файл и после запуска там пусто?
7 дек 15, 11:52    [18523170]     Ответить | Цитировать Сообщить модератору
 Re: SQLCMD  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8826
alex171069,

вы не понимаете, как откатывается транзакция, если указано имя.
7 дек 15, 11:57    [18523236]     Ответить | Цитировать Сообщить модератору
 Re: SQLCMD  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
alex171069,

Вангую, есть уже процедура потому и не создается,

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[InsertCommConGT4]') AND type in (N'P', N'PC'))
7 дек 15, 12:01    [18523271]     Ответить | Цитировать Сообщить модератору
 Re: SQLCMD  [new]
alex171069
Member

Откуда: Новосибирск
Сообщений: 281
Процедуры нет т.к. база в которой создается хранимка удаляется - отладка ...
И процесс запускается снова.
Парадокс в том, что кроме этой хранимки создаются еще 78 хранимок и создаются нормально.
А вот эта никак ....!
7 дек 15, 12:10    [18523362]     Ответить | Цитировать Сообщить модератору
 Re: SQLCMD  [new]
Ошибки нет111
Guest
alex171069,

и чем эта хранимка от всех отличается? не наличием работы со строками?
лог ошибок-то формируется? или анализ на уровне "не упало"? не все ошибки батч опрокидывают.

+есть более цивильный вариант переписать:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[InsertCommConGT4]') AND type in (N'P', N'PC')) 
  EXEC ('Create procedure [dbo].[InsertCommConGT4] as')


а потом альтер открытым текстом без всяких даблкавычек и прочей ерунды.
7 дек 15, 12:17    [18523415]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить