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

Откуда:
Сообщений: 58
Всем привет
подскажите что лучше использовать(view или function) и по производительности и по обновляемости. у меня есть запросик, вот хочу чтобы его использовали другие, но облегчить им жизнь, и чтобы я мог менять этот запрос как мне надо, при этом не ломая ничего у других, кто будет его использовать.
DECLARE @deviceDenis TABLE (DeviceType INT, DeviceName varchar(25))
insert @deviceDenis
select '1' DeviceType, 'Printer' DeviceName union all 
select '2', 'Validator' union all select '3', 'Dog' union all
select '4', 'Version' union all
select '11', 'Updater' union all select '14', 'CoinAcceptor'

DECLARE @ErrorsTableDenis TABLE (ErrorID INT, [Message] TEXT COLLATE Cyrillic_General_CI_AS NULL PRIMARY KEY (ErrorID))
INSERT @ErrorsTableDenis
SELECT ErrorID, [Message] FROM LastErrors as x INNER JOIN (SELECT TerminalID FROM Terminals where terminalid in (2, 8893583)) as y ON x.TerminalID = Y.TerminalID

SELECT X.ErrorID, X.[Message], Y.TerminalID, KP.KP_LOGIN, Y.EventDateTime, Y.ErrorCode, Y.DeviceType, Y.DeviceNumber, Y.Description, d.DeviceName
FROM @ErrorsTableDenis as X LEFT JOIN (
SELECT Errors.ErrorID, Errors.TerminalID, Errors.EventDateTime, Errors.ErrorCode, Errors.DeviceType, Errors.DeviceNumber,
(SELECT [Description] FROM TerminalErrorCodes WHERE TerminalErrorCodes.ErrorCode = Errors.ErrorCode) AS [Description],
(SELECT [Weight] FROM TerminalErrorCodes WHERE TerminalErrorCodes.ErrorCode = Errors.ErrorCode) AS [Weight]
FROM Errors) as Y ON X.ErrorID = Y.ErrorID
INNER JOIN (
select a.terminalid, a.somexml.value('(root/kp_login/text())[1]', 'nvarchar(150)') as KP_LOGIN
from (select t.TerminalID, cast(s.extrainfo as xml) as somexml 
    from Subdealers s 
    inner join Terminals t on s.SubdealerId = t.SubdealerID 
    where t.TerminalID in (2, 8893583)
    ) as a
) as KP ON KP.TerminalID = Y.TerminalID
inner join @deviceDenis d on d.DeviceType = Y.DeviceType
WHERE Y.TerminalID IN (2, 8893583) AND Y.DeviceType != 7 AND X.[Message] IS NOT NULL ORDER BY Y.TerminalID;
22 ноя 12, 13:59    [13513134]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
_djХомяГ
Guest
а как табличные переменные во view использовать
22 ноя 12, 14:03    [13513162]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
_djХомяГ
а как табличные переменные во view использовать
В виде CTE или производных таблиц, например.
Непонятно, где тут внешние параметры, чтобы о функции говорить.
Или табличные переменные - это на самом деле табличные параметры (SQL2008+)?
22 ноя 12, 14:26    [13513379]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
dolf85
Member

Откуда:
Сообщений: 58
по этому запросу возвращаются данные, которые буду использоваться другими людьми, вот чтобы они весь этот запрос не использовали я хотел сделать что-то наподобие
create view view_name as....
, но там нельзя использовать declare, поэтому подумал, что придется использовать create function, подскажите как этот запрос вставить в create view?
22 ноя 12, 14:50    [13513589]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
dolf85
Member

Откуда:
Сообщений: 58
чтобы я мог менять запрос как хочу и при этом им не нужно было ничего менять у себя
22 ноя 12, 14:51    [13513599]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
Crimean
Member

Откуда:
Сообщений: 13148
вот это:

select '1' DeviceType, 'Printer' DeviceName union all
select '2', 'Validator' union all select '3', 'Dog' union all
select '4', 'Version' union all
select '11', 'Updater' union all select '14', 'CoinAcceptor'

спокойно делается "константное" представление

( 2, 8893583 ) - параметры? можно сделать инлайновую UDF с этими параметрами, будет == представлению с параметрами и не особо отличаться от "просто представления"
22 ноя 12, 14:54    [13513624]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
CREATE VIEW V AS
WITH
 deviceDenis AS(SELECT * FROM(VALUES(1,'Printer'),(2,'Validator'),(3,'Dog'),(4,'Version'),(11,'Updater'),(14,'CoinAcceptor'))T(DeviceType,DeviceName))
,ErrorsTableDenis AS(SELECT ErrorID, [Message] FROM LastErrors x JOIN Terminals y ON x.TerminalID=y.TerminalID WHERE y.terminalid IN(2,8893583))
SELECT X.ErrorID, X.[Message], Y.TerminalID, KP.KP_LOGIN, Y.EventDateTime, Y.ErrorCode, Y.DeviceType, Y.DeviceNumber, Y.Description, d.DeviceName
FROM ErrorsTableDenis as X LEFT JOIN (
SELECT Errors.ErrorID, Errors.TerminalID, Errors.EventDateTime, Errors.ErrorCode, Errors.DeviceType, Errors.DeviceNumber,
(SELECT [Description] FROM TerminalErrorCodes WHERE TerminalErrorCodes.ErrorCode = Errors.ErrorCode) AS [Description],
(SELECT [Weight] FROM TerminalErrorCodes WHERE TerminalErrorCodes.ErrorCode = Errors.ErrorCode) AS [Weight]
FROM Errors) as Y ON X.ErrorID = Y.ErrorID
INNER JOIN (
select a.terminalid, a.somexml.value('(root/kp_login/text())[1]', 'nvarchar(150)') as KP_LOGIN
from (select t.TerminalID, cast(s.extrainfo as xml) as somexml 
    from Subdealers s 
    inner join Terminals t on s.SubdealerId = t.SubdealerID 
    where t.TerminalID in (2, 8893583)
    ) as a
) as KP ON KP.TerminalID = Y.TerminalID
inner join deviceDenis d on d.DeviceType = Y.DeviceType
WHERE Y.TerminalID IN (2, 8893583) AND Y.DeviceType <> 7 AND X.[Message] IS NOT NULL;
C SELECTом после CTE даже и не разбирался.
Он настолько ужасен...
Откуда такая манера JOINы писать? Из Oracle что ли?
ORDER BY внутри представлений и функций невозможен.
22 ноя 12, 15:07    [13513730]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
Гость333
Member

Откуда:
Сообщений: 3683
dolf85
[Message] TEXT COLLATE Cyrillic_General_CI_AS NULL

А чего TEXT, а не VARCHAR(MAX)?
22 ноя 12, 15:23    [13513889]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
dolf85
Member

Откуда:
Сообщений: 58
я новичок, особо еще не понимаю в sql, а плохо использовать inner join для объединения как это делаю я?
22 ноя 12, 16:09    [13514206]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
dolf85
я новичок, особо еще не понимаю в sql, а плохо использовать inner join для объединения как это делаю я?
А зачем там везде подзапросы-то?
Почему JOINами последовательно не пользоваться?
22 ноя 12, 16:22    [13514292]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
dolf85
Member

Откуда:
Сообщений: 58
ну потому что еще новичок и не сразу вижу, что и как можно сделать:
так я пытался прописать недостающее в базе, но вы показали как сделать лучше:
DECLARE @deviceDenis TABLE (DeviceType INT, DeviceName varchar(25))
insert @deviceDenis
select '1' DeviceType, 'Printer' DeviceName union all 
select '2', 'Validator' union all select '3', 'Dog' union all
select '4', 'Version' union all
select '11', 'Updater' union all select '14', 'CoinAcceptor'

так пытался вытащить нужные мне данные:
DECLARE @ErrorsTableDenis TABLE (ErrorID INT, [Message] TEXT COLLATE Cyrillic_General_CI_AS NULL PRIMARY KEY (ErrorID))
INSERT @ErrorsTableDenis
SELECT ErrorID, [Message] FROM LastErrors as x INNER JOIN (SELECT TerminalID FROM Terminals where terminalid in (2, 8893583)) as y ON x.TerminalID = Y.TerminalID

а тут просто преобразую текст в xml, чтобы потом вытащить нужный мне тэг kp_login:
select a.terminalid, a.somexml.value('(root/kp_login/text())[1]', 'nvarchar(150)') as KP_LOGIN
from (select t.TerminalID, cast(s.extrainfo as xml) as somexml 
    from Subdealers s 
    inner join Terminals t on s.SubdealerId = t.SubdealerID 
    where t.TerminalID in (2, 8893583)
22 ноя 12, 16:34    [13514390]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
dolf85
Member

Откуда:
Сообщений: 58
кстати лучше использовать create view или CREATE OR REPLACE VIEW?
22 ноя 12, 16:40    [13514449]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
Гость333
Member

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

Попробуйте CREATE OR REPLACE VIEW.
22 ноя 12, 16:48    [13514519]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Гость333
dolf85,

Попробуйте CREATE OR REPLACE VIEW.
Да!
Ну, пробуйте. Пробуйте!

dolf85, может, всё проще, и Вы ошиблись форумом?
22 ноя 12, 16:50    [13514532]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
пахнет Ораклом
22 ноя 12, 16:51    [13514552]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Maxx
пахнет Ораклом
А там тоже так выглядит:
DECLARE @deviceDenis TABLE (DeviceType INT, DeviceName varchar(25))
?
22 ноя 12, 16:56    [13514603]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
Maxx
пахнет Ораклом
А там тоже так выглядит:
DECLARE @deviceDenis TABLE (DeviceType INT, DeviceName varchar(25))
?
ЕМНИП, там даже типы данных другие?
22 ноя 12, 16:57    [13514608]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
Maxx
Member [скрыт]

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

я про create or replace
22 ноя 12, 16:57    [13514612]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
dolf85
Member

Откуда:
Сообщений: 58
вам что трудно объяснить, что я не туда посмотрел? просто стоит задача, чтобы данные во вьхе обновлялись и те, кто ею будут пользоваться не зависели от того, как я буду изменять запрос, когда на гугле стал искать по поводу обновления данных в view то попал на CREATE OR REPLACE VIEW.
22 ноя 12, 16:58    [13514619]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ну тут как бы следующая ситуация - все таки стоит чистать хелп именно по тому продукту с которым работаете ,ИМХО
22 ноя 12, 17:01    [13514652]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
Glory
Member

Откуда:
Сообщений: 104760
dolf85
вам что трудно объяснить, что я не туда посмотрел?

Для этого сначала нужно узнать, куда вы посмотрели.

dolf85
просто стоит задача, чтобы данные во вьхе обновлялись

Такое представление будет очень трудно сделать обновляемым

dolf85
когда на гугле стал искать по поводу обновления данных в view то попал на CREATE OR REPLACE VIEW.

Поколение гугл. Не хотите воспользоваться документацией производителя ?
22 ноя 12, 17:03    [13514665]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
dolf85
Member

Откуда:
Сообщений: 58
читал доку http://msdn.microsoft.com/ru-ru/library/ms187956.aspx (CREATE VIEW (Transact-SQL)), но там ничего не сказано, что будет с выводом данных конечному пользователю при изменения запроса, находящегося внутри view, а это для меня критично, так как ожидается, что select * from view будет делаться каждые 5сек, и если я например в свой запрос добавлю параметров, конечный пользователь это сразу увидит?
22 ноя 12, 17:10    [13514719]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
Glory
Member

Откуда:
Сообщений: 104760
dolf85
но там ничего не сказано, что будет с выводом данных конечному пользователю при изменения запроса, находящегося внутри view,

Дайте подумать,.... мне кажется после изменения текста запроса его последующий вызов вернет данные, соответствующие новому тексту запроса. Странно, если бы было по-другому.

dolf85
и если я например в свой запрос добавлю параметров, конечный пользователь это сразу увидит?

Нет, он увидит того, как запустит запрос и дождется его окончания.
22 ноя 12, 17:14    [13514748]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
dolf85
Member

Откуда:
Сообщений: 58
Спасибо большое, значит всё работает.
22 ноя 12, 17:20    [13514804]     Ответить | Цитировать Сообщить модератору
 Re: create function или create view  [new]
Glory
Member

Откуда:
Сообщений: 104760
dolf85
Спасибо большое, значит всё работает.

Т.е. если бы вам сказали "нет", то вы даже проверять бы не стали ?
22 ноя 12, 17:21    [13514818]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить