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

Откуда:
Сообщений: 7
Всем доброе время суток.
Нужна помощь в решении такой задачи.

Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008 13:01:59 Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 5.1 (Build 2600: Service Pack 3)

Имеются следующие таблицы:

CREATE TABLE s_ks --Справочник "Улицы"
  ID int IDENTITY(1, 1) NOT NULL,
  NAME nvarchar(200)
GO

CREATE TABLE s_zones --Справочник "Районы"
  ID int IDENTITY(1, 1) NOT NULL,
  ZONE_NAME nvarchar (50), --номер зоны
  LINK_KS int not null, --внешний ключ на s_ks.ID (улица)
  DIAPAZON nvarchar(100)
GO
GO

CREATE TABLE houses --Рабочая таблица с адресами
  ID int IDENTITY(1, 1) NOT NULL,
  LINK_KS int NOT NULL, --внешний ключ на s_ks.ID (улица)
  HOUSE_NUM int --номер дома

Поле DIAPAZON таблицы s_zones содержит диапазон адресов формата
1-4,Ч(6-10),Н(11-15)

Есть хранимая процедура (взята из темы форума)
CREATE procedure parse (@s nvarchar(1000))
as
begin
WITH
 Part(S) AS
 (
  SELECT LTRIM(SUBSTRING(@S,V1.number, MIN(V2.number)-V1.number))
  FROM master.dbo.spt_values V1 JOIN master.dbo.spt_values V2
  ON V1.type='P' AND V2.type='P' AND SUBSTRING(','+@S,V1.number,1)=',' AND SUBSTRING(@S+',',V2.number,1)=',' AND V1.number<V2.number
  GROUP BY V1.number
 )
,Range(Step,Start,Finish) AS
 (
  SELECT
   CASE WHEN S LIKE '[НЧ]%' THEN 2 WHEN S LIKE '%-%' THEN 1 ELSE 0 END,
   CAST(SUBSTRING(S, PATINDEX('%[0-9]%',S), CHARINDEX('-',S+'-')-PATINDEX('%[0-9]%',S)) AS INT),
   CAST(ISNULL(SUBSTRING(S, NULLIF(CHARINDEX('-',S),0)+1, PATINDEX('%[0-9][^0-9-]%',S+')')-CHARINDEX('-',S)),S) AS INT)
  FROM Part
 )
,List(N,Step,Finish) AS
(
 SELECT Start, Step, Finish FROM Range
 UNION ALL
 SELECT N+Step, Step, Finish FROM List WHERE N<Finish
)
SELECT DISTINCT N FROM List ORDER BY N OPTION(MAXRECURSION 0)
end;

которая парсит указанную строку, возвращая набор данных следующего вида:
N
1
2
3
4
6
8
10
11
13
15


Необходимо создать представление вида

HOUSES.IDHOUSES.LINK_KSHOUSES.HOUSE_NUMZONES.ZONE_NAME
1110Зона 4


т.е. нужно проверить, к какой зоне из Справочника s_zones относится комбинация "Улица" и "Номер дома" из основной таблицы HOUSES

Голову сломал на том, как заставить использовать хранимую процедуру для проверки на принадлежность к диапазону.

Если можете помочь, буду очень признателен.
Заранее всем спасибо.

Сообщение было отредактировано: 24 ноя 09, 13:10
24 ноя 09, 12:28    [7969505]     Ответить | Цитировать Сообщить модератору
 Re: Про  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
1. Процедуру можно переделать в функцию.
2. Можно faq почитать наконец.
24 ноя 09, 12:29    [7969517]     Ответить | Цитировать Сообщить модератору
 Re: Про  [new]
stv-nik
Member

Откуда:
Сообщений: 7
Гавриленко Сергей Алексеевич
1. Процедуру можно переделать в функцию.
2. Можно faq почитать наконец.

Пробую переделать - не получается :( Можете помочь в этом деле?
24 ноя 09, 12:34    [7969573]     Ответить | Цитировать Сообщить модератору
 Re: Про  [new]
stv-nik
Member

Откуда:
Сообщений: 7
Попытка переделать процедуру в функцию типа

ALTER function parse
(
  @s nvarchar(1000)
)
returns  
@RetTable TABLE
(
  N int
)
as
begin
WITH
 Part(S) AS
 (
  SELECT LTRIM(SUBSTRING(@S,V1.number, MIN(V2.number)-V1.number))
  FROM master.dbo.spt_values V1 JOIN master.dbo.spt_values V2
  ON V1.type='P' AND V2.type='P' AND SUBSTRING(','+@S,V1.number,1)=',' AND SUBSTRING(@S+',',V2.number,1)=',' AND V1.number<V2.number
  GROUP BY V1.number
 )
,Range(Step,Start,Finish) AS
 (
  SELECT
   CASE WHEN S LIKE '[НЧ]%' THEN 2 WHEN S LIKE '%-%' THEN 1 ELSE 0 END,
   CAST(SUBSTRING(S, PATINDEX('%[0-9]%',S), CHARINDEX('-',S+'-')-PATINDEX('%[0-9]%',S)) AS INT),
   CAST(ISNULL(SUBSTRING(S, NULLIF(CHARINDEX('-',S),0)+1, PATINDEX('%[0-9][^0-9-]%',S+')')-CHARINDEX('-',S)),S) AS INT)
  FROM Part
 )
,List(N,Step,Finish) AS
(
 SELECT Start, Step, Finish FROM Range
 UNION ALL
 SELECT N+Step, Step, Finish FROM List WHERE N<Finish
)
insert @RetTable SELECT DISTINCT N FROM List ORDER BY N OPTION(MAXRECURSION 0)
RETURN
end;
GO

выдает ошибку
Невозможно выполнить процедуру изменения для "parse" из-за несовместимого типа объекта.
24 ноя 09, 12:39    [7969635]     Ответить | Цитировать Сообщить модератору
 Re: Про  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
stv-nik
выдает ошибку
Невозможно выполнить процедуру изменения для "parse" из-за несовместимого типа объекта.
Процедурку-то дропни сначала.
24 ноя 09, 12:43    [7969671]     Ответить | Цитировать Сообщить модератору
 Re: Про  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Функцию создать надо сначала.
24 ноя 09, 12:44    [7969680]     Ответить | Цитировать Сообщить модератору
 Re: Про  [new]
stv-nik
Member

Откуда:
Сообщений: 7
Большое спасибо! Все получилось.
24 ноя 09, 13:01    [7969890]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Проблемы при использовании ХП в представлении  [new]
LeffBA
Guest
Пол часа "тыкался", не мог понять, почему не получается?! Оказывается все до боли просто: под несовместимостью типов подразумевался объект "функция", а не объекты В функции... Досадно. Спасибо всем!
27 фев 15, 21:40    [17323298]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы при использовании ХП в представлении  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
LeffBA
Пол часа "тыкался", не мог понять, почему не получается?! Оказывается все до боли просто: под несовместимостью типов подразумевался объект "функция", а не объекты В функции... Досадно. Спасибо всем!
5 с половиной лет думал?
28 фев 15, 12:34    [17325104]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить