Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Скаижте каким раком работает CASE  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
10 минут бился, но не поддаётся это логике.
select
	case
		WHEN	(select Favority from tblClients where ID = <qdfSales>.<ClientID>) 
		
		THEN	(select Price from tblMain where id=<ProductID>) 
END


Работает, хотя условия WHEN нету, а вот так
select
	case
		WHEN	(select Favority from tblClients where ID = <qdfSales>.<ClientID>) = 1
		
		THEN	(select Price from tblMain where id=<ProductID>) 

не работает.

Пишет ошибку типа
select
case when 1=1=1 then 5.5

<> - эти кавычки они чисто программные, обозначают подстановку значения из текущей записи ну мол


select
	case
		WHEN	(select Favority from tblClients where ID = 1) = 1
		
		THEN	(select Price from tblMain where id=43)


Кстати, поле Favority типа ДА/НЕТ (-1/1)
12 окт 12, 21:52    [13311546]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Мде. Может таки не жадничать и нанять специалиста?
select
 Price
from
 tblMain
where
 id=<ProductID> and
 exists(select * from tblClients where ID = <qdfSales>.<ClientID> and Favority = 1);
12 окт 12, 22:05    [13311604]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Kimel,

какой запрос до сервера-то доходит?
В Profilerе что видно?
12 окт 12, 22:09    [13311619]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
invm,

Твой код мне не подходит
У меня есть программный тригер который ОЧЕНЬ ПЛОХО ДРУЖИТ со всем кроме case select from where и так далее
Вот полный код РАБОЧЕГО на 100% запроса
update tblSalesProducts set SalePrice = 

	case
		WHEN	(select Favority from tblClients where ID = <qdfSales>.<ClientID>) 
		
		THEN	(select Price from tblMain where id=<ProductID>) 
		
		when
				(select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID> and Ordinal = <Ordinal>) <= 
				(select ISNULL(QuantityPerUnit,1) from tblMain where ID=<ProductID>)		
		THEN 
				(select PriceOut2 from tblMain where id=<ProductID>) 
		
		WHEN 
				(select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID> and Ordinal = <Ordinal>) >= 
				(select ISNULL(QuantityPerUnit,1) from tblMain where ID=<ProductID>)	and 
				(select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID> and Ordinal = <Ordinal>) <	
				(select DiscOt from tblMain where ID=<ProductID> )
		
		THEN 
				(select PriceOut1 from tblMain where id=<ProductID>) 
		when
				(select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID> and Ordinal = <Ordinal>) >= 
				(select DiscOt from tblMain where ID=<ProductID>)		
		THEN 
				(select Price from tblMain where id=<ProductID>) 
		ELSE 
				(select PriceOut1 from tblMain where ID=<ProductID>)
			
		END
where ProductID = <ProductID> and SaleID = <SaleID> and SalePrice IS NULL and Ordinal = <Ordinal>


Этот тригер цену выставляет в зависимости от указаного количества продажи и других вещей, но волнует первая строка, так как везде условие
when 5=6 then 2
в таком духе, а тут
when 1 then 2
12 окт 12, 22:10    [13311621]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
Kimel
Member

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

Да видно. и там к сожалению он интерпретируется (именно первая часть case ) when 1=1=1 then 5 то есть так вот. но откуда 1=1=1 я не долго думал вообще убрал сравнение и всё гуд стало, парадокс
12 окт 12, 22:11    [13311629]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
Kimel
Работает, хотя условия WHEN нету, а вот так
Что то вы всё напутали.

Оба варианта синтаксически неправильные, а такого текста ошибки быть не может:
Kimel
Пишет ошибку типа
select
case when 1=1=1 then 5.5
12 окт 12, 22:11    [13311630]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
Maxx
Member [скрыт]

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

ех забыл ты поговорку - жадный платит дважды
12 окт 12, 22:12    [13311636]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Нифига)) Уже всё работает но пока я не понял как. Я сейчас напишу какую ошибку говорит, скрин дам.
Картинка с другого сайта.
12 окт 12, 22:16    [13311661]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
Kimel
Нифига)) Уже всё работает но пока я не понял как. Я сейчас напишу какую ошибку говорит, скрин дам.
Это говорит какая то поделка, такие тут не обсуждают :-)

Тут форум по сиквелу, и обсуждаются проблемы и задачи для него.
12 окт 12, 22:19    [13311674]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
alexeyvg,

Я не спорю программа какой-то УГ. Но к счастью я понял что разработчик пофиг на её безопасность и триал сбивается простой чисткой реестра с удалением проги. По этому она мне подходит.
Но всё же где логика у разраба, как такой запрос может работать...
12 окт 12, 22:21    [13311685]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
Kimel
Но всё же где логика у разраба, как такой запрос может работать...
Ну так мало ли, на каком запросе пишутся там программы?

Может, на том языке это и правильно.
12 окт 12, 22:23    [13311693]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
alexeyvg,

Не знаю может быть это о чём-то скажет.
Provider=SQLOLEDB.1;
12 окт 12, 22:24    [13311697]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Kimel,

Скажите как посмотреть через студию лог того какие запросы идут к серверу?
12 окт 12, 22:25    [13311702]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Kimel
Kimel,

Скажите как посмотреть через студию лог того какие запросы идут к серверу?
Я ж Вам уже сказал - Profiler, а не студия
12 окт 12, 22:28    [13311720]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
Ищите profiler:

К сообщению приложен файл. Размер - 46Kb
12 окт 12, 22:30    [13311727]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
SIMPLicity_,

Так провёл трассировку вот файл, а если лень читать вот кусок трасировки

select * from UPDATE tblSalesProducts SET SalePrice = 

	case
		WHEN	 1 = 1 = 1 
		
		THEN	2.65 
		
		when
				1 <= 
				'1'		
		THEN 
				5 
		
		WHEN 
				1 >= 
				'1'	AND 1 <	
				1000
		
		THEN 
				3.5 
		when
				1 >= 
				1000		
		THEN 
				2.65 
		ELSE 
				3.5
			
		END WHERE ProductID = 41 AND SaleID = 226 AND SalePrice IS NULL AND Ordinal = 1


К сообщению приложен файл (trrasss.rar - 8Kb) cкачать
12 окт 12, 22:42    [13311795]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
Kimel

select * from UPDATE tblSalesProducts SET SalePrice = 

	case
		WHEN	 1 = 1 = 1 
		
		THEN	2.65 
		
		when
				1 <= 
				'1'		
		THEN 
				5 
		
		WHEN 
				1 >= 
				'1'	AND 1 <	
				1000
		
		THEN 
				3.5 
		when
				1 >= 
				1000		
		THEN 
				2.65 
		ELSE 
				3.5
			
		END WHERE ProductID = 41 AND SaleID = 226 AND SalePrice IS NULL AND Ordinal = 1

Коллега, у Вас ЭТО хоть как-то работает?!
12 окт 12, 22:54    [13311849]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
SIMPLicity_,

Это нет, но когда в триггере всё таки убираю условие на when (делаю триггер теоретически не рабочим) то всё работает и трассировка показывает
case
WHEN 1 = 1

THEN 2.65

Я только 1 не понимаю. Разраб говорит мол помомагает только своим клиентам. НООШИБКА ПРОГРАММНАЯ И ОНА У ВСЕХ, А НЕ ТОЛЬКО У МЕНЯ. Вот и нанимай таки дибилов(
12 окт 12, 23:02    [13311888]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
Вообщето в трейсе это вот так:
UPDATE tblSalesProducts SET SalePrice = 

	case
		WHEN	 1 = 1 = 1 
		
		THEN	2.65 
		
		when
				1 <= 
				'1'		
		THEN 
				5 
		
		WHEN 
				1 >= 
				'1'	AND 1 <	
				1000
		
		THEN 
				3.5 
		when
				1 >= 
				1000		
		THEN 
				2.65 
		ELSE 
				3.5
			
		END WHERE ProductID = 41 AND SaleID = 226 AND SalePrice IS NULL AND Ordinal = 1

Видимо в глюкогенератор передали вместо '1' значение '1=1'. За каким хyuем, я уж ждаже не могу предполагать... Ну при генерации и появился такой скрипт.

Вот эту херню 1 >= '1' скуль ещё может хоть как-то сожрать, но вот это что должно означать: WHEN 1 = 1 = 1 ? Типа "когда 3ае6исьКак единица будет равна единице, то..." ...
12 окт 12, 23:03    [13311893]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
Kimel
SIMPLicity_,

Это нет, но когда в триггере всё таки убираю условие на when (делаю триггер теоретически не рабочим) то всё работает и трассировка показывает
case
WHEN 1 = 1

THEN 2.65

Я только 1 не понимаю. Разраб говорит мол помомагает только своим клиентам. НООШИБКА ПРОГРАММНАЯ И ОНА У ВСЕХ, А НЕ ТОЛЬКО У МЕНЯ. Вот и нанимай таки дибилов(

Текст триггера - в студию... Сюда то есть...
12 окт 12, 23:05    [13311899]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
SIMPLicity_,
ТАК РАБОТАЕТ
update tblSalesProducts set SalePrice = 

	case
		WHEN	(select Favority from tblClients where ID=<tblSales>.<ClientID>) 
		
		THEN	(select Price from tblMain where id=<ProductID>) 
		
		when
				(select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID> and Ordinal = <Ordinal>) <= 
				(select ISNULL(QuantityPerUnit,1) from tblMain where ID=<ProductID>)		
		THEN 
				(select PriceOut2 from tblMain where id=<ProductID>) 
		
		WHEN 
				(select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID> and Ordinal = <Ordinal>) >= 
				(select ISNULL(QuantityPerUnit,1) from tblMain where ID=<ProductID>)	and 
				(select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID> and Ordinal = <Ordinal>) <	
				(select DiscOt from tblMain where ID=<ProductID> )
		
		THEN 
				(select PriceOut1 from tblMain where id=<ProductID>) 
		when
				(select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID> and Ordinal = <Ordinal>) >= 
				(select DiscOt from tblMain where ID=<ProductID>)		
		THEN 
				(select Price from tblMain where id=<ProductID>) 
		ELSE 
				(select PriceOut1 from tblMain where ID=<ProductID>)
			
		END
where ProductID = <ProductID> and SaleID = <SaleID> and SalePrice IS NULL and Ordinal = <Ordinal>


А ТАК НЕТ
update tblSalesProducts set SalePrice = 

	case
		WHEN	(select Favority from tblClients where ID=<tblSales>.<ClientID>) = 1
		
		THEN	(select Price from tblMain where id=<ProductID>) 
		
		when
				(select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID> and Ordinal = <Ordinal>) <= 
				(select ISNULL(QuantityPerUnit,1) from tblMain where ID=<ProductID>)		
		THEN 
				(select PriceOut2 from tblMain where id=<ProductID>) 
		
		WHEN 
				(select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID> and Ordinal = <Ordinal>) >= 
				(select ISNULL(QuantityPerUnit,1) from tblMain where ID=<ProductID>)	and 
				(select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID> and Ordinal = <Ordinal>) <	
				(select DiscOt from tblMain where ID=<ProductID> )
		
		THEN 
				(select PriceOut1 from tblMain where id=<ProductID>) 
		when
				(select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID> and Ordinal = <Ordinal>) >= 
				(select DiscOt from tblMain where ID=<ProductID>)		
		THEN 
				(select Price from tblMain where id=<ProductID>) 
		ELSE 
				(select PriceOut1 from tblMain where ID=<ProductID>)
			
		END
where ProductID = <ProductID> and SaleID = <SaleID> and SalePrice IS NULL and Ordinal = <Ordinal>
12 окт 12, 23:06    [13311902]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
В трассе такого нет...
А текст триггера-то где?
Типа, криэйт трига .... тра ля-ля...
12 окт 12, 23:13    [13311927]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
SIMPLicity_,

Всё я за*бался
Всё и так работает через жопу)))
12 окт 12, 23:23    [13311957]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
Всем спс за помощь, теперь я знаю как смотреть логи, это единственное чем вы мне помогли, спасибо
PS. В гугле искал 10 мин так и не нашёл
12 окт 12, 23:23    [13311962]     Ответить | Цитировать Сообщить модератору
 Re: Скаижте каким раком работает CASE  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
SIMPLicity_
Текст триггера - в студию... Сюда то есть...
Выше уже обсудили - нет у него триггера.

Да, и пишет он не на T-SQL, так что к тексту нужно относиться с известной долей скепсиса...

2 Kimel - я вас предупреждал, ещё много человек про триггер скажет, не употребляйте это слово :-)
12 окт 12, 23:31    [13311987]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить