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

Откуда:
Сообщений: 41
Привет.
Хочу создать функцию что бы она обрабатывала всю таблицу.

Сама функция.

автор
CREATE FUNCTION getRoad(@Road_id String)
RETURNS GEOMETRY
AS
BEGIN
SELECT Track.Track
FROM Segment_ID
WHERE Segment_ID.Road_Id=@Road_id
LEFT JOIN Track ON Segment_ID.Segment_ID = Track.Segment_ID
RETURN
END


Селект в функции возвращает некоторое количество полей Track.Track, которые я хочу обработать функцией STUnion(). Тоесть последовательно сделать что то вроде такого Track_i.STUnion(Track_i+1). Это возможно сделать? И в какую сторону смотреть что бы найти примеры?
25 фев 13, 09:12    [13974496]     Ответить | Цитировать Сообщить модератору
 Re: Как создать функцию для каждой строки.  [new]
Добрый Э - Эх
Guest
у тебя, что ли, некое дерево/иерархия? Если что, рекурсивный CTE - как раз для таких целей заточен.
25 фев 13, 09:14    [13974509]     Ответить | Цитировать Сообщить модератору
 Re: Как создать функцию для каждой строки.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
mkliver
Это возможно сделать? И в какую сторону смотреть что бы найти примеры?
Зависит от версии, смотрите cross apply.

Если возможно, используйте CTE вместо функции
25 фев 13, 09:18    [13974525]     Ответить | Цитировать Сообщить модератору
 Re: Как создать функцию для каждой строки.  [new]
mkliver
Member

Откуда:
Сообщений: 41
Вервия SQL SERVER R2 2008.

Что такое CTE?

автор
у тебя, что ли, некое дерево/иерархия?


Можно сказать что дерево. У меня есть дорога состоящая из сегментов. И теперь нужно сегменты собрать в цельную дорогу.
25 фев 13, 09:24    [13974542]     Ответить | Цитировать Сообщить модератору
 Re: Как создать функцию для каждой строки.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
mkliver
Что такое CTE?
Это вид подзапроса, в частности, можно написать рекурсивный запрос.

Набираете в хелпе CTE, там есть примеры таких запросов.
25 фев 13, 09:27    [13974552]     Ответить | Цитировать Сообщить модератору
 Re: Как создать функцию для каждой строки.  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
mkliver
Что такое CTE?
Common Table Expression
А почему для дороги используете geometry, а не geography?
25 фев 13, 09:29    [13974567]     Ответить | Цитировать Сообщить модератору
 Re: Как создать функцию для каждой строки.  [new]
mkliver
Member

Откуда:
Сообщений: 41
НУ вот смотрю я CTE пример на сайте майкрософта:

автор
USE AdventureWorks2008R2;
GO
-- Define the CTE expression name and column list.
WITH Sales_CTE (SalesPersonID, SalesOrderID, SalesYear)
AS
-- Define the CTE query.
(
SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS SalesYear
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL
)
-- Define the outer query referencing the CTE name.
SELECT SalesPersonID, COUNT(SalesOrderID) AS TotalSales, SalesYear
FROM Sales_CTE
GROUP BY SalesYear, SalesPersonID
ORDER BY SalesPersonID, SalesYear;
GO


И не совсем его понимаю. Разве нельзя было сразу применить Count()? Я правда мало что смыслю в sql. Но все равно может дадите мне пример где функция последовательно выполняется над парами строк для всей выборки?
25 фев 13, 09:29    [13974569]     Ответить | Цитировать Сообщить модератору
 Re: Как создать функцию для каждой строки.  [new]
mkliver
Member

Откуда:
Сообщений: 41
автор
А почему для дороги используете geometry, а не geography?


Geography плохо распознается другим ПО. В частности Geoserver его видит как byte[]. Поэтому приходится конвертировать.
25 фев 13, 09:31    [13974579]     Ответить | Цитировать Сообщить модератору
 Re: Как создать функцию для каждой строки.  [new]
mkliver
Member

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

То есть я правильно понимаю у меня тут СТЕ записано?

https://www.sql.ru/forum/actualthread.aspx?tid=1006866

Если так то все плохо запрос пять минут выполняется(
25 фев 13, 09:33    [13974591]     Ответить | Цитировать Сообщить модератору
 Re: Как создать функцию для каждой строки.  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
mkliver
iap,

То есть я правильно понимаю у меня тут СТЕ записано?

https://www.sql.ru/forum/actualthread.aspx?tid=1006866

Если так то все плохо запрос пять минут выполняется(
Я Вам дал ссылку не РЕКУРСИВНОЕ CTE
А Вы мне на что-то другое. По крайней мере, UNION ALL я там не заметил.
К тому же так плохо оформлено, что глаза сломаешь.

Простое же CTE само по себе не может ни ускорять, ни замедлять выполнение запроса.
Это всего лишь удобная запись.
Вместо этого обратите внимание на индексы в Ваших таблицах.
Ну и структура базы играет роль.

Да! Если Вы хотите тормоз получше, - сочиняйте скалярную UDF или табличную UDF, но не inline.
25 фев 13, 09:56    [13974733]     Ответить | Цитировать Сообщить модератору
 Re: Как создать функцию для каждой строки.  [new]
mkliver
Member

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

Ну union all и по вашей ссыле и в моем примере есть.
Но если я правильно вас понял, то смысла переделывать мой запрос в функцию нет, скорость не увеличится.
Структуру базу к сожалению изменить не могу.
И такой вопрос по индексам. Беглый гугл показал, что индексов несколько типов и создаются они на отдельные поля. Вы можете что нибудь посоветовать как лучше индексы организовать?
И извините за оформление.
25 фев 13, 10:07    [13974809]     Ответить | Цитировать Сообщить модератору
 Re: Как создать функцию для каждой строки.  [new]
iap
Member

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

да, посмотрел повнмательнее - там у Вас как раз рекурсивное CTE. Извините, не заметил.
25 фев 13, 11:41    [13975343]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить