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

Откуда:
Сообщений: 87
Поделитесь пожалуйста процедурой переделывающей КЛАДР в иерархическую структуру
15 апр 11, 07:38    [10521537]     Ответить | Цитировать Сообщить модератору
 Re: Поделитесь процедуркой по КЛАДРу  [new]
Андрей___Р
Member

Откуда:
Сообщений: 9
;WITH ds AS (
SELECT NAME, LEFT(CODE, 11)  AS CODE, NULL AS DOMA
	, SOCR
	, CASE
		WHEN CAST(SUBSTRING(CODE, 9, 3) AS INT) > 0 
			THEN	CAST(
						REPLACE(
						REPLACE(
						REPLACE(
						REPLACE(
							'/' + SUBSTRING(CODE, 1, 2) + '/' + SUBSTRING(CODE, 3, 3) + '/' + SUBSTRING(CODE, 6, 3) + '/' + SUBSTRING(CODE, 9, 3) + '/'
						, '/000/', '/1/')
						, '/000/', '/1/')
						, '/00', '/')
						, '/0', '/') AS HIERARCHYID)
			
		WHEN CAST(SUBSTRING(CODE, 6, 3) AS INT) > 0 
			THEN	CAST(
						REPLACE(
						REPLACE(
						REPLACE(						
							'/' + SUBSTRING(CODE, 1, 2) + '/' + SUBSTRING(CODE, 3, 3) + '/' + SUBSTRING(CODE, 6, 3) + '/'
						, '/000/', '/1/')
						, '/00', '/')
						, '/0', '/') 
					AS HIERARCHYID)
			
		WHEN CAST(SUBSTRING(CODE, 3, 3) AS INT) > 0 
			THEN	CAST(
						REPLACE(
						REPLACE(
						REPLACE(
							'/' + SUBSTRING(CODE, 1, 2) + '/' + SUBSTRING(CODE, 3, 3) + '/'
						, '/000/', '/1/')
						, '/00', '/')
						, '/0', '/') 
					
					AS HIERARCHYID)
			
		WHEN CAST(SUBSTRING(CODE, 1, 2) AS INT) > 0 
			THEN	CAST(
						REPLACE(
							'/' + SUBSTRING(CODE, 1, 2) + '/'
						, '/0', '/') 
					AS HIERARCHYID)
	END	AS [KladrNode]	
FROM DataImport.KLADR_Kladr
WHERE RIGHT(CODE, 2) = '00'

UNION ALL

SELECT s.NAME, LEFT(s.CODE, 15), d.NAME
	, s.SOCR
	, CASE
		WHEN CAST(SUBSTRING(s.CODE, 12, 4) AS INT) > 0 
			THEN	CAST(
						REPLACE(
						REPLACE(
						REPLACE(
						REPLACE(
						REPLACE(
							'/' + SUBSTRING(s.CODE, 1, 2) + '/' + SUBSTRING(s.CODE, 3, 3) + '/' + SUBSTRING(s.CODE, 6, 3) + '/' + SUBSTRING(s.CODE, 9, 3) + '/' + + SUBSTRING(s.CODE, 12, 4) + '/'
						, '/000/', '/1/')
						, '/000/', '/1/')
						, '/000', '/')						
						, '/00', '/')
						, '/0', '/') AS HIERARCHYID)
	
		WHEN CAST(SUBSTRING(s.CODE, 9, 3) AS INT) > 0 
			THEN	CAST(
						REPLACE(
						REPLACE(
						REPLACE(
						REPLACE(
							'/' + SUBSTRING(s.CODE, 1, 2) + '/' + SUBSTRING(s.CODE, 3, 3) + '/' + SUBSTRING(s.CODE, 6, 3) + '/' + SUBSTRING(s.CODE, 9, 3) + '/'
						, '/000/', '/1/')
						, '/000/', '/1/')
						, '/00', '/')
						, '/0', '/') AS HIERARCHYID)
			
		WHEN CAST(SUBSTRING(s.CODE, 6, 3) AS INT) > 0 
			THEN	CAST(
						REPLACE(
						REPLACE(
						REPLACE(						
							'/' + SUBSTRING(s.CODE, 1, 2) + '/' + SUBSTRING(s.CODE, 3, 3) + '/' + SUBSTRING(s.CODE, 6, 3) + '/'
						, '/000/', '/1/')
						, '/00', '/')
						, '/0', '/') 
					AS HIERARCHYID)
			
		WHEN CAST(SUBSTRING(s.CODE, 3, 3) AS INT) > 0 
			THEN	CAST(
						REPLACE(
						REPLACE(
						REPLACE(
							'/' + SUBSTRING(s.CODE, 1, 2) + '/' + SUBSTRING(s.CODE, 3, 3) + '/'
						, '/000/', '/1/')
						, '/00', '/')
						, '/0', '/') 
					
					AS HIERARCHYID)
			
		WHEN CAST(SUBSTRING(s.CODE, 1, 2) AS INT) > 0 
			THEN	CAST(
						REPLACE(
							'/' + SUBSTRING(s.CODE, 1, 2) + '/'
						, '/0', '/') 
					AS HIERARCHYID)
	END
FROM DataImport.KLADR_Street AS s
	LEFT JOIN DataImport.KLADR_Doma AS d
		ON s.CODE = LEFT(d.CODE, 17)
WHERE RIGHT(s.CODE, 2) = '00'
)
SELECT CODE, KladrNode.ToString() AS KladrNode, SPACE(3 * KladrNode.GetLevel()) + RTRIM(Name) + ' ' + SOCR AS Name, DOMA
FROM DS
ORDER BY CODE


как-то так
выбирает только актуальные объекты
2008 server
12 май 11, 09:46    [10639517]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить