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

Откуда:
Сообщений: 12
У меня такая ситуация.
Есть программа на Delphi+SQL Server

Передаю параметры :

dm.Xtbl.Parameters.ParamByName('cuser').Value := DM.USERSID.Value;
dm.Xtbl.Parameters.ParamByName('ukind').Value := DM.USERSID.Value;


Сам SQL запрос :

declare @cuser INT
declare @ukind int

set @cuser = :cuser
set @ukind = :ukind

SELECT
	SI.DATE AS [DATE],
	-1 AS CUTOMER,
	SI.ITEM,
	0 AS DISCOUNT,
	(SI.QUANTITY * (SELECT TOP 1 IIF(@ukind = 1,P.PRICE,P.PRICE1) FROM PRICES P WHERE (SI.ITEM = P.ITEM) AND (P.DATE <=SI.DATE) ORDER BY P.DATE DESC )) AS [TOTAL]
FROM
	STOCKIN SI
WHERE SI.KIND <> 2 AND SI.USR = @cuser


А теперь сам вопрос этот (программа+запрос) работал нормально на моем кампутере
(Win 7, Delphi 2010, Sql server express 2012)
Поставил эту же программу на другой
(Win 2008 server, Sql server 2008 r2)
Оно перестала работать. Пробовал запросы выполнить на SSMS те же ошибки
Invalid Syntax near ‘=’.
В чем дело? И как правильно передавать параметры, потому что это единственный вариант который я знаю. В инете ничего внятного не нашел. Все через процедуры
Заранее спасибо
27 апр 12, 08:22    [12477512]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
qwerty112
Guest
Regata,

автор
IIF(@ukind = 1,P.PRICE,P.PRICE1) 


не могло ЭТО "работать",
это Акцессовский синтаксис


автор
Sql server express 2012

эээ, ... меняйте эту часть на
case when @ukind = 1 then P.PRICE else P.PRICE1 end
27 апр 12, 08:32    [12477530]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
Regata
Member

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

ok. но предположим я поменял. но к сожалению мне так и не удалось добратса до этой части кода. застрял на

declare @cuser INT
declare @ukind int

set @cuser = :cuser
set @ukind = :ukind


т.е видать что то нето с параметрами. но как получилоь что она работала у меня и не сработал там досих пор загадка.
а вобще как ещё передать параметры или инициализировать переменные
declare @cuser INT
declare @ukind int
27 апр 12, 08:42    [12477553]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
qwerty112
Guest
Regata
т.е видать что то нето с параметрами. но как получилоь что она работала у меня и не сработал там досих пор загадка.
а вобще как ещё передать параметры или инициализировать переменные
declare @cuser INT
declare @ukind int

set @cuser = :cuser
set @ukind = :ukind

а эта часть и не нужна, раз это просто запрос из Делфи,
вот прямо в запросе и пропиши делфовые параметры
AND SI.USR = :cuser
27 апр 12, 08:49    [12477569]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
Regata
Member

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

ok. на самом деле запрос такой

declare @cuser INT
declare @ukind int

set @cuser = :cuser
set @ukind = :ukind

SELECT
	SS.DATE AS [TARIH],
	SUM(CASE WHEN (SS.CUSTOMER > 0) AND (SS.ITEM > 0) THEN SS.TOTAL ELSE 0 END) AS C1,
	SUM(CASE WHEN (SS.CUSTOMER = 1) AND (SS.ITEM > 0) THEN SS.TOTAL ELSE 0 END) AS C2,
	SUM(CASE WHEN (SS.CUSTOMER > 1) AND (SS.ITEM > 0) THEN SS.TOTAL ELSE 0 END) AS C3,
	SUM(CASE WHEN (SS.CUSTOMER > 1) AND (SS.ITEM = 0) THEN SS.TOTAL ELSE 0 END) AS C4,
	SUM(CASE WHEN (SS.CUSTOMER > 1) AND (SS.ITEM > 0) THEN SS.DISCOUNT ELSE 0 END) AS C5,
	SUM(CASE WHEN SS.CUSTOMER = 1  THEN SS.DISCOUNT ELSE 0 END) AS C6,
	SUM(CASE WHEN (SS.CUSTOMER = 0) AND (SS.ITEM = 0) THEN SS.TOTAL ELSE 0 END) AS C7,
	SUM(CASE WHEN SS.CUSTOMER = -1 THEN SS.TOTAL ELSE 0 END) AS C8,
	SUM(CASE WHEN (SS.CUSTOMER = 0) AND (SS.ITEM > 0) THEN SS.TOTAL ELSE 0 END) AS C9,
	SUM(CASE WHEN SS.ITEM=-1 THEN SS.TOTAL ELSE 0 END) AS C10

FROM

(

SELECT
	SD.DATE AS [DATE],
	SD.CUSTOMER,
	S.ITEM,
	S.DISCOUNT,
    [TOTAL] =
    CASE WHEN S.EK = 1 THEN
      (
        round((S.QUANTITY * I.WEIGHT) * (((SELECT TOP 1 IIF(@ukind = 1,P.PRICE,P.PRICE1) FROM PRICES P WHERE (S.ITEM = P.ITEM) AND (P.DATE <=SD.DATE) ORDER BY P.DATE DESC) / I.WEIGHT) + 5),0)
      )
    WHEN S.EK = 2 THEN
      (
        CASE
        	WHEN (S.ITEM = 7)  THEN ROUND((S.QUANTITY * I.WEIGHT) * ((SELECT TOP 1 IIF(@ukind = 1,P.PRICE,P.PRICE1) FROM PRICES P WHERE ( 2 = P.ITEM) AND (P.DATE <=SD.DATE) ORDER BY P.DATE DESC) - 1),0)
        	WHEN (S.ITEM = 11) THEN ROUND((S.QUANTITY * I.WEIGHT) * ((SELECT TOP 1 IIF(@ukind = 1,P.PRICE,P.PRICE1) FROM PRICES P WHERE ( 8 = P.ITEM) AND (P.DATE <=SD.DATE) ORDER BY P.DATE DESC) - 1),0)
        	WHEN (S.ITEM = 15) THEN ROUND((S.QUANTITY * I.WEIGHT) * ((SELECT TOP 1 IIF(@ukind = 1,P.PRICE,P.PRICE1) FROM PRICES P WHERE (12 = P.ITEM) AND (P.DATE <=SD.DATE) ORDER BY P.DATE DESC) - 1),0)
		ELSE
	    	round((S.QUANTITY * I.WEIGHT) * (((SELECT TOP 1 IIF(@ukind = 1,P.PRICE,P.PRICE1) FROM PRICES P WHERE (S.ITEM = P.ITEM) AND (P.DATE <=SD.DATE) ORDER BY P.DATE DESC) / I.WEIGHT) + 4),0)
        END
      )
  ELSE
    (S.QUANTITY * (SELECT TOP 1 IIF(@ukind = 1,P.PRICE,P.PRICE1) FROM PRICES P WHERE (S.ITEM = P.ITEM) AND (P.DATE <=SD.DATE) ORDER BY P.DATE DESC))
  END

FROM
	DOCS AS SD
	JOIN STOCK AS S ON SD.ID = S.DOC
	JOIN ITEMS AS I ON I.ID = S.ITEM

WHERE SD.USR = @cuser

UNION ALL

SELECT
	SI.DATE AS [DATE],
	-1 AS CUTOMER,
	SI.ITEM,
	0 AS DISCOUNT,
	(SI.QUANTITY * (SELECT TOP 1 IIF(@ukind = 1,P.PRICE,P.PRICE1) FROM PRICES P WHERE (SI.ITEM = P.ITEM) AND (P.DATE <=SI.DATE) ORDER BY P.DATE DESC )) AS [TOTAL]
FROM
	STOCKIN SI
WHERE SI.KIND <> 2 AND SI.USR = @cuser

UNION ALL

SELECT
	K.DATE AS [DATE],
	K.CUSTOMER,
	K.REASON AS ITEM,
	0 AS DISCOUNT,
	K.AMOUNT AS [TOTAL]
FROM
	KASA K

WHERE K.USR = @cuser

UNION ALL
SELECT
	GK.DATE AS [DATE],
	0 AS CUSTOMER,
	-1 AS ITEM,
	0 AS DISCOUNT,
	GK.AMOUNT AS [TOTAL]
FROM
	GKASA GK

WHERE GK.USR = @cuser

) AS SS

WHERE month(getdate()) = month(SS.DATE) and year(getdate())  = year(SS.DATE)
GROUP BY SS.DATE;


т.е :cuser и :ukind появляютса несколько раз и в списке параметров появляютса много параметров с одинаковыми именами.
и ктому же это только один из запросов. и у всех остальнох таже ошибка.
я даже не знаю счего начать
27 апр 12, 09:01    [12477605]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
уТКа
Member

Откуда: Страна дураков и разбитых дорог
Сообщений: 1266
Regata,

Слушай Буратино, ты либо напиши с первого раза че тебе надо либо не пиши вовсе, а то устроил тут качели "а вот запрос на самом деле такой"

и прими за правило: Ругательную ошибку нерабочего запроса нужно делать "копи-пасте".
27 апр 12, 09:14    [12477665]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
qwerty112
Guest
Regata
т.е :cuser и :ukind появляютса несколько раз и в списке параметров появляютса много параметров с одинаковыми именами.
и ктому же это только один из запросов. и у всех остальнох таже ошибка.
я даже не знаю счего начать

про "таже ошибка" - я тебе всё сказал, - исправляй IIF
и "приходи" с другой ошибкой

>> т.е :cuser и :ukind появляютса несколько раз и в списке параметров

и что, одноимённый параметр, нужно вводить несколько раз ?? вооще странно , если так ...

нуу, можно тогда оставить так как у тебя есть - с declare/set
27 апр 12, 09:19    [12477690]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
Regata
Member

Откуда:
Сообщений: 12
повторяю свой вопрос. для 'утки' уТОЧНЯю

автор
А теперь сам вопрос этот (программа + запрос) работал нормально на моем кампутере
(Win 7, Delphi 2010, Sql server express 2012)

коментарий : это значит что программа и сам запрос работает на 100%, ни кокой ошибки и как надо. т.е не важно
и так
case when @ukind = 1 then P.PRICE else P.PRICE1 end
и так
IIF(@ukind = 1,P.PRICE,P.PRICE1)

оно работает


автор
Поставил эту же программу на другой
(Win 2008 server, Sql server 2008 r2)
Оно перестала работать. Пробовал запросы выполнить на SSMS те же ошибки
Invalid Syntax near ‘=’.

комментарий : а это значит что та же программа, с теми же настройками, с этим же запросом, т.е полный копи паст перестала работать, а точнее сама программа работает а вот запрос нет. я не знаю проблема то ли разнице версиях SQL Serverа или ОС хотя вряд ли. ну в общем что я пытаюсь выяснить. Или я меняю полностью программу или благодаря вашим умным идеям обойдусь мене радикальным способом
В чем дело? И как правильно передавать параметры, потому что это единственный вариант который я знаю. В инете ничего внятного не нашел. Все через процедуры

комментарий : а это значит что я попробовал получить ответ в других форумах.
что мог собрать это
text1 := 'select';
text2 := 'col1,col2,col3';
text3 := 'from';
text4 := 'table1';

т.е собрать мозаику. надеюсь смысл понятен

автор
Заранее спасибо

комментарий : а это значит что и значит
27 апр 12, 09:50    [12477857]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
qwerty112
Guest
Regata,

автор
проблема то ли разнице версиях SQL Serverа

да
27 апр 12, 09:54    [12477873]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
invm
Member

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

В 2012 сервере есть IIF, в более младших версиях -- нет.
27 апр 12, 10:38    [12478152]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
Regata
Member

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

спосибо за уточнение да и всем ответившим. у меня осталось последняя часть вопроса.
как передать значение в переменные
@cuser
@ukind
например если я не ошибаюсь в Access это вроде
select
t1.col1,
t1.col2,
t1.col3
from table1 t1
where t1.col3 = :param1

и аксес запрашивал значение param1
и досихпор у меня в SQL Servere это работало
27 апр 12, 11:05    [12478322]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
Glory
Member

Откуда:
Сообщений: 104751
Regata
и досихпор у меня в SQL Servere это работало

Прямо вот так в Managament Studio и работало ?
27 апр 12, 11:08    [12478343]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
cat84
Member

Откуда: Россия, Приморский край
Сообщений: 4
Regata,

set @cuser = :cuser
set @ukind = :ukind


Эм... Или я туплю или лыжи не едут... ":cuser" - вот так вот в самом дельфи параметры в запрос передаются. А нафига в коде хранимки оно так написано ???
27 апр 12, 12:24    [12478972]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
iljy
Member

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

:имя - это синтаксис провайдера, а не сервера. Соответственно некоторые провайдеры такой синтаксис понимают, некоторые нет (с ходу уже не помню какие). Более универсальный - с использованием ? и подстановкой по порядку.
27 апр 12, 12:26    [12478984]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
Regata
Member

Откуда:
Сообщений: 12
Спасибо всем воде бы работает.
И так в итоге
конструкция
IIF(@ukind = 1,P.PRICE,P.PRICE1) --заслуга qwerty112 за код, invm за подсказку совместимости версиях//Работала потому что у меня SQL Server 2012 

Так что поменял на
case when @ukind = 1 then P.PRICE else P.PRICE1 end --заслуга qwerty112


кстати если попробовать это на EMS Database Management Studio все работает
автор
заслуга iljy
:имя - это синтаксис провайдера, а не сервера. Соответственно некоторые провайдеры такой синтаксис понимают, некоторые нет (с ходу уже не помню какие). Более универсальный - с использованием ? и подстановкой по порядку.

declare @cuser INT
declare @ukind int
set @cuser = ?
set @ukind = ?

блин так и не смог заставить работать или где то что пропустил
27 апр 12, 13:32    [12479536]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
Glory
Member

Откуда:
Сообщений: 104751
Regata
это на EMS Database Management Studio все работает

А причем тут EMS, Access и прочие ?
В TSQL нет синтаксиса для вывода диалогов клиенту
27 апр 12, 13:40    [12479591]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
Regata
Member

Откуда:
Сообщений: 12
Glory,
да впринципе ни причем. просто мне покозалось странным что разных студиях или програмах все вышеперечисленое то работала а в некоторых нет тем боле что все они используют одну и ту же базу и сервер
но судя по коментариям iljy
автор
:имя - это синтаксис провайдера, а не сервера. Соответственно некоторые провайдеры такой синтаксис понимают, некоторые нет (с ходу уже не помню какие). Более универсальный - с использованием ? и подстановкой по порядку.

так и должно. а так поверьте я никого не хотел этим запутать
27 апр 12, 14:51    [12480179]     Ответить | Цитировать Сообщить модератору
 Re: Запросы с параметрами  [new]
iljy
Member

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

вы понимаете, что такое провайдер OLEDB? Так вот, из дельфей вы пользуетесь параметризацией на уровне провайдера, а студия - нет, она просто передает текст на выполнение as is.
27 апр 12, 16:41    [12481233]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить