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

Откуда:
Сообщений: 41
Так почему-то не работает и пишет: Конфликт типов операндов: date несовместим с int.
create procedure myProc @date varchar(50)
AS
DECLARE @name varchar(10)
DECLARE @id_param int
DECLARE @cdate smalldatetime
declare @query1 varchar(MAX)
set @query1 = ''

declare cur CURSOR FOR
select id_param, [name] from params

open cur

FETCH NEXT FROM cur INTO @id_param, @name

WHILE @@FETCH_STATUS = 0
BEGIN
	set @query1 = @query1 + @name +
	' = ISNULL((SELECT [value] FROM Objects_params WHERE id_param = ' + Cast(@id_param as varchar(50)) +
	' AND id_object = sel.id_object AND CAST(cdate AS date) = '+ @date +'), NULL),'	
fetch cur into @id_param, @name
END
set @query1 = LEFT(@query1, LEN(@query1) - 1)

execute('select id_object, ' + @query1 + ' FROM (select id_object, [name], [value], cdate
from Objects_params join params ON (Objects_params.id_param = params.id_param)) sel
GROUP BY id_object')

close cur
deallocate cur
GO

execute myProc @date='1980-01-10'


А так работает прекрасно:
create procedure myProc @date varchar(50)
AS
DECLARE @name varchar(10)
DECLARE @id_param int
DECLARE @cdate smalldatetime
declare @query1 varchar(MAX)
set @query1 = ''

declare cur CURSOR FOR
select id_param, [name] from params

open cur

FETCH NEXT FROM cur INTO @id_param, @name

WHILE @@FETCH_STATUS = 0
BEGIN
	set @query1 = @query1 + @name +
	' = ISNULL((SELECT [value] FROM Objects_params WHERE id_param = ' + Cast(@id_param as varchar(50)) +
	' AND id_object = sel.id_object AND CAST(cdate AS date) = ''1980-01-10''), NULL),'	
fetch cur into @id_param, @name
END
set @query1 = LEFT(@query1, LEN(@query1) - 1)

execute('select id_object, ' + @query1 + ' FROM (select id_object, [name], [value], cdate
from Objects_params join params ON (Objects_params.id_param = params.id_param)) sel
GROUP BY id_object')

close cur
deallocate cur
GO

execute myProc @date='1980-01-10'


В рабочем варианте я просто напрямую поставил дату для сравнения в тело процедуры, не используя её параметр. Почему так?
25 сен 16, 21:33    [19706482]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
Vyacheslav07,
Ковычек наверно мало. Добавьте еще по 2 справла и слева от переменной @date
25 сен 16, 21:50    [19706522]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
Vyacheslav07
Member

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

шарите сударь, заработало, а почему так, интересно? =)
25 сен 16, 21:57    [19706543]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
iljy
Member

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

шарите сударь, заработало, а почему так, интересно? =)


А вы выведете сформированную строку на печать и посмотрите. Одинарная кавычка - это ограничитель строки, чтоб сделать ее внутри, нужно ее продублировать. И есть большая разница между '1980-01-10' и 1980-01-10, второе - это целое число 1969. И как раз оно с типом date несовместимо.
25 сен 16, 22:04    [19706567]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
iljy, спасибо, а как можно законвертить smalldatetime в varchar, чтобы формат был без времени, только год месяц и число через дефис?
25 сен 16, 22:53    [19706651]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
Vyacheslav07
Member

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

ALTER TABLE Objects_params ADD RetailDate AS (CONVERT(varchar(50),cdate,5))

выдает: Столбец "RetailDate" в таблица "Objects_params" невозможно использовать в индексе, статистике или в качестве ключа секции, так как он не является детерминированным.
25 сен 16, 23:01    [19706658]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
iljy
Member

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

ну да, операция преобразования считается недетерминированной. А вопрос-то в чем?
25 сен 16, 23:23    [19706709]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
Vyacheslav07
Member

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

я застрял на том, чтобы написать индекс на уникальность трех полей в совокупе, одно из этих полей типа smalldatetime, а мне надо сравнивать с точностью до даты. Date в MS SQL Server 2000 не было, надо чтобы там работало. Я уже все перепробовал, не выходит.
25 сен 16, 23:30    [19706730]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
iljy
Member

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

используйте детерминированные функции и стандартное документированное округление даты

create table #t (
   d datetime,
   dd as dateadd(d, datediff(d, 0, d), 0)
)

create unique index IX on #t(dd)

go
drop table #t
26 сен 16, 00:32    [19706827]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
Vyacheslav07
Member

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

я решил все-таки написать триггер, не судьба быть индексам в моем скрипте, все-равно также ругается на поле dd.
Вот триггер, но он не выполняется при вставке в таблицу, как так:
create trigger checkTrigger on dbo.Objects_params
for insert
as
begin
  print 'inserted!'
end
26 сен 16, 00:44    [19706844]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
iljy
Member

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

у меня все работает

use tempdb
go

create table t (
   d datetime,
   dd as dateadd(d, datediff(d, 0, d), 0)
)

create unique index IX on t(dd)
go

create trigger checkTrigger on t
for insert
as
begin
  select 1
end

go
insert t values('20110101')

select * from t
go
drop table t
26 сен 16, 01:31    [19706879]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
Vyacheslav07
Member

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

очень странно, у меня триггеры вообще напрочь отказываются выполняться. Я уже решил как написать, но не могу проверить:

create trigger checkTrigger on dbo.Objects_params
for insert, update
as
IF (SELECT COUNT(*) FROM inserted i join Objects_params
on Objects_params.id_object = i.id_object and Objects_params.id_param = i.id_param
WHERE CAST(i.cdate AS varchar(50)) like SUBSTRING(CAST(Objects_params.cdate AS varchar(50)), 0, 13) + '%')>0
begin
  print 'inserted!'
  rollback tran
end


Почему у меня вообще триггеры никогда не выполняются, не знаете в чем может быть дело?
26 сен 16, 01:48    [19706885]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
iljy
Member

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

че-то у вас там чудеса какие-то и мистика, он хочется встать в третью позицию и торжественно сказать "не верю!!!". Давайте полные версии сервера и студии, уровень совместимости БД и скрипты создания таблицы, индекса и триггера, а заодно - как проверяете, что триггер не работает.
26 сен 16, 01:54    [19706891]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
iljy
Member

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

да, и еще. Вместо (SELECT COUNT(*) ...) > 0 гораздо правильнее писать EXISTS.
26 сен 16, 01:56    [19706893]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
iljy
Member

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

и еще 2. Сравнивать даты преобразованием в строки это, с точки зрения оптимизатора, треш, угар и содомия. Вместо

WHERE CAST(i.cdate AS varchar(50)) like SUBSTRING(CAST(Objects_params.cdate AS varchar(50)), 0, 13) + '%')>0


пишите
Objects_params.cdate >= dateadd(d, datediff(d,0,i.cdate),0) and Objects_params.cdate < dateadd(d, datediff(d,0,i.cdate),1)



и еще 3. У вас в триггере синтаксическая ошибка ( > 0), так что, скорее всего, он у вас тупо не создается.
26 сен 16, 02:03    [19706896]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
iljy
Member

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

не, вру, нет синтаксической ошибки, просто код отформатирован так, что глаза сломаешь.
26 сен 16, 02:04    [19706897]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
Vyacheslav07
Member

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

Я устанавливал и запускал по этому гайду, http://j2eetutorials.50webs.com/install-mssql.html
Потом внизу статьи "Next" и там гайд как запускать сервер
Потом еще раз "Next" и там гайд как использовать Quert Analyzer

Все делал как там, а скачивал отсюда: https://yadi.sk/public/?hash=bfrzxjCt00drHzOJq68Vb BJXYonseYq0aLBPkGItMc=

Екзешник создаст папку "SQLEVAL", в ней заходил в "x86\setup" и юзал "setupsql.exe" и устанавливал согласно гайду, который уже линканул.

Ведь все работает, индексы работают, а триггеры нет. Надо пробовать с индексом, раз триггеры не видит система, если получится обойти недетерминированность.

Вот создание таблиц:
CREATE TABLE params (
	id_param smallint NOT NULL PRIMARY KEY,
	[name] varchar(10)
	);
	
CREATE TABLE Objects_params (
	id_object int NOT NULL,
	id_param smallint FOREIGN KEY REFERENCES params(id_param),
	cdate smalldatetime,
	[value] int
	);


И на вот такой например индекс ругается из за недетерминированности:
SET ARITHABORT ON
	
ALTER TABLE Objects_params ADD RetailDate AS (CAST(cdate AS int))


CREATE UNIQUE INDEX my_index
	ON Objects_params(id_object, id_param, RetailDate)
26 сен 16, 10:14    [19707373]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Vyacheslav07, сделайте так:

ALTER TABLE Objects_params ADD RetailDate AS CONVERT(CHAR(8),cdate,112);
26 сен 16, 10:22    [19707417]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
Vyacheslav07
Member

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

Спасибо за помощь! Работает! Потом уже как-нибудь разберусь с триггерами как время появится =)
26 сен 16, 12:37    [19708090]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
WarAnt
Member

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

а сиквел почти двадцатилетней давности вы специально ставите или просто на год выпуска статьи не посмотрели?:)
26 сен 16, 14:46    [19708842]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
Vyacheslav07
Member

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

Я не смотрел) но на 2008 версии триггер также не работает =(
26 сен 16, 14:54    [19708871]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт типов операндов: date несовместим с int  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Vyacheslav07
WarAnt,

Я не смотрел) но на 2008 версии триггер также не работает =(
Что вы делаете, чтобы он сработал? Засекречено?
26 сен 16, 14:58    [19708895]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить