Ładowanie FIAS do bazy danych na MSSQLSERVER przy użyciu dostępnych (SQLXMLBULKLOAD) narzędzi. Jak tego (najprawdopodobniej) nie należy robić

Epicka:
«Kiedy masz młotek w ręku, wszystko wokół wydaje się gwoździem».

Ładowanie FIAS do bazy danych na MSSQLSERVER przy użyciu dostępnych (SQLXMLBULKLOAD) narzędzi. Jak tego (najprawdopodobniej) nie należy robić
Dawno temu, wydaje mi się – w zeszły piątek, przeszedłem się w okolicy biura i moje nieszczęsne kierownictwo martwiło się, że spędzam czas na lenistwie i patrzeniu na koty.

— A czy nie wczytać ci FIAS-u, przyjacielu! – powiedział szef. – Bowiem proces jego wczytywania nie podoba się naszym działom biznesowym. Mówią, że wczytuje się długo, obciążając serwer produktów, a facet, który napisał proces wczytywania, niedawno się zwolnił, już prawie trzy lata temu.
Na dodatek, wszystko tam trzeba było poprawić, więc weź, stwórz sobie bazę i zapewnij okresowe wczytywanie FIAS-u. Cóż, jak mówi się, nie zatrzymuję!

Tu muszę powiedzieć, że mam z programowaniem luźny związek, ponieważ jestem raczej DBA. Chociaż z drugiej strony, wczytywanie dużych zbiorów wcześniej przetworzonej informacji – to właśnie zadanie DBA, prawda?

— No dobra... Zajmiemy się tym – powiedziałem do kierownictwa, i rzuciłem się na stronę FIAS-u, zakasując rękawy.

«O! Jest tu dbf!» — pomyślałem, radośnie pocierając dłonie, jednocześnie dziwiąc się braku standardowego archiwum „de-facto” zip, a wręcz obecności dawno umarłego arj oraz własnościowego, przepraszam, otwartego, oczywiście 7zip [ale którego wciąż nie można rozpakować za pomocą polecenia powershell Expand-Archive]. To znaczy, czystym powershell’em tego nie ściągniesz ani nie rozpakujesz. Będzie trzeba załadować na serwer wszelką tego typu radość. Ale cóż.

Narzędzie do masowego równoległego wczytywania plików dbf napisałem już kilka lat temu, więc nie powinno być problemów.

Rozpakowałem dbf-ki, uruchomiłem program wczytywania, a podczas wczytywania danych napisałem skrypt, który łączył oddzielne „prawie-jednoimienne” tabelki w jedną, według przynależności.

Wczytałem dane i już miałem zamiar udać się do biura kierownictwa, aby zgarnąć, tak to ujmując, laury, jednak coś mnie podkusiło, żeby sprawdzić wyniki importu!

Ładowanie FIAS do bazy danych na MSSQLSERVER przy użyciu dostępnych (SQLXMLBULKLOAD) narzędzi. Jak tego (najprawdopodobniej) nie należy robić

— Ups. WTF!!!???

Ładowanie FIAS do bazy danych na MSSQLSERVER przy użyciu dostępnych (SQLXMLBULKLOAD) narzędzi. Jak tego (najprawdopodobniej) nie należy robić

Duże tabele wczytywały się normalnie, a małe – zawierały krzaki.

Z tego wszystkiego stało mi się tak smutno i przygnębiająco, że dzielnie wziąłem się w garść i zająłem się prokrastynacją oraz swoimi bezpośrednimi obowiązkami. Bawienie się uszkodzonymi dbf-kami – szalenie mnie nie pociągało.

Przez dwa dni prokrastynowałem, aż wnioski się skończyły, a na horyzoncie znowu pojawił się szef z sakramentalnym pytaniem „A co to my tak się lenimy?”.

I ponieważ nie miałem na to odpowiedzi, a bawić się z dbf wciąż nie chciałem, postanowiłem załadować FIAS z xml, tym bardziej że, jak mówią, stylowo, modnie, młodzieżowo, a „dbf to umierający format”.
Na tym pozwólcie, że zakończę długie wprowadzenie i przejdę do rzeczy.

Epigraf 2:
Tak, to też jest możliwe. 🙂

Zdecydowano załadować przy pomocy SQLXMLBULKLOAD – świetnej biblioteki, która jest przeznaczona do masowego (bulk) wczytywania strukturalnych plików xml.
Aby ją użyć, należy pobierz zainstalować bibliotekę SqlXml 4.0 Service Pack 1 (SP1).

W przypadku FIAS, jednak, „strukturalność” nie jest szczególnie pożądana. Pliki tam nie są, co prawda, nie xml… są oczywiście xml, ale w zasadzie to płaskie tabelki z danymi, w każdym pliku – jedna tabela.

Na stronie sql.ru znalazłem procedurę spXMLBulkLoad szanowanego użytkownika Mnior, aby całkowicie nie wychodzić poza granice serwera SQL i nie pisać nawet wywołania SQLXMLBULKLOAD na CLR.

Oto lekko zmodyfikowana jej wersja:

spXMLBulkLoad

UŻYJ [FIAS2]
GO

/****** Obiekt: ProceduraPrzechowywana [dbo].[spXMLBulkLoad]    Data skryptu: 13.05.2019 18:05:58 ******/
USTAW ANSI_NULLS ON
GO

USTAW QUOTED_IDENTIFIER ON
GO


-- Należy zezwolić na procedury automatyzacji Ole:
	-- EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;

-- Przykład:
	-- EXEC dbo.spXMLBulkLoad 'Z:PathData.xml','Z:PathSchema.xsd', 'FIAS', 'Z:Patherror.xml'

STWÓRZ PROCEDURĘ [dbo].[spXMLBulkLoad] (
	 @File		SysName
	,@Schema	SysName
	,@DataBase	SysName	= ''
	,@ErrorLog	SysName
) AS 
BEGIN 
	DECLARE	 @ErrCode	Int
		,@OLEXMLBulk	Int
		,@ErrMethod		SysName
		,@ErrDescript	NVarChar(4000)
	
	EXEC @ErrCode = sys.sp_OACreate 'SQLXMLBulkLoad.SQLXMLBulkload', @OLEXMLBulk OUT
	IF (@ErrCode = 0) 
	BEGIN
		SET	@DataBase	= 'Provider=SQLOLEDB;Data Source=.;DataBase=' + @DataBase + ';Zintegrowane zabezpieczenia=SSPI'
		EXEC @ErrCode = sys.sp_OASetProperty @OLEXMLBulk ,'ConnectionString', @DataBase		
			IF (@ErrCode  0) 
				BEGIN SET @ErrMethod = 'ConnectionString'	
					  GOTO Błąd 
				END
		EXEC @ErrCode = sys.sp_OASetProperty @OLEXMLBulk ,'ErrorLogFile', @ErrorLog		
			IF (@ErrCode  0) 
				BEGIN SET @ErrMethod = 'ErrorLogFile'	
					  GOTO Błąd 
				END

		EXEC @ErrCode = sys.sp_OASetProperty @OLEXMLBulk, 'CheckConstraints', 1			
			IF (@ErrCode  0) 
				BEGIN SET @ErrMethod = 'CheckConstraints'	
					  GOTO Błąd 
				END

		--EXEC @ErrCode = sys.sp_OASetProperty @OLEXMLBulk, 'ForceTableLock', 1			
		--	IF (@ErrCode  0) 
		--		BEGIN SET @ErrMethod = 'ForceTableLock'	
		--		  GOTO Błąd 
		--		END
		
		EXEC @ErrCode = sys.sp_OAMethod	@OLEXMLBulk, 'Execute', NULL, @Schema, @File
		IF (@ErrCode  0) 
		BEGIN
			SET @ErrMethod = 'Execute'
			DECLARE	 @Exist	Int
					,@Error	XML
				    ,@SQL	NvarChar(max)
			EXEC master.dbo.xp_FileExist @ErrorLog, @Exist OUT
			IF (@Exist = 1) 
			BEGIN
				 -- Z pliku @ErrorLog
				Set @SQL = N'SELECT  @Error = E.Error + CASE WHEN Right(E.Error,1)  ''>'' THEN ''lt>'' ELSE '''' END '
						   + N'FROM OPENROWSET(BULK '''+ @ErrorLog +''', SINGLE_NCLOB) E(Error)'
				exec sp_executesql @SQL, N'@Error xml OUTPUT', @Error=@Error OUTPUT 
				
				SELECT	@ErrDescript	= IsNull(@ErrDescript,'') + E.Error.value('Description[1]','SysName') + ' '
				FROM	@Error.nodes('Result/Error')E(Error)
				SELECT	@ErrDescript	= IsNull(@ErrDescript,'') + E.Error.value('Description[1]','SysName') + ' '
				FROM	@Error.nodes('Error/Record')E(Error)
			END 
			ELSE
				GOTO Błąd
		END
		GOTO Zniszcz
	Błąd:	
			EXEC @ErrCode = sys.sp_OAGetErrorInfo @OLEXMLBulk, @ErrorLog OUT, @ErrDescript OUT
	Zniszcz:
			EXEC @ErrCode = sys.sp_OADestroy @OLEXMLBulk
	END 
	ELSE
		SELECT	 
			 @ErrMethod	= 'SQLXMLBulkLoad.SQLXMLBulkload'
			,@ErrorLog	= 'sp_OACreate'
			,@ErrDescript	= 'Błąd podczas tworzenia obiektu OLE'
	
	-- Wyświetlanie błędów
	IF (@ErrMethod IS NOT NULL) 
	BEGIN
		RAISERROR('Błąd podczas wykonywania metody "%s" w "%s": %s',18,1, @ErrMethod, @ErrorLog, @ErrDescript)
		RETURN	@@Error
	END
END
GO

Jednak aby przeprowadzić masowe ładowanie XML za pomocą tej biblioteki, potrzebne są adnotowane schemy XSD, które wskazują, w jaki sposób i dokąd ładujemy dane.

Wzmianki na temat tego, że takie schemy istnieją, „ale tylko stare” — znalazłem na co najmniej dziesięciu stronach, jednak nigdzie nie znalazłem samych schem. Co mnie zdenerwowało.

Modyfikacja istniejącej na stronie FIAS schemy do ręcznego importu danych nie jest trudna.
Ale… w sumie – jest tam 271 pól! Ileż to trzeba siedzieć i myśleć!

Dlatego zdecydowałem się automatycznie zmodyfikować te schemy, jednocześnie tworząc docelowe tabele w bazie danych.

SQLXMLBULKLOAD potrafi automatycznie tworzyć tabele dla ładowanych danych na podstawie adnotowanej schemy, ale z drugiej strony, jeśli sam tworzę tę schemę, to czemu by nie stworzyć tych tabel samodzielnie, tak jak mi pasuje?

Pobrałem schemy xsd z witryny FIAS i przeanalizowałem je wizualnie.

Na szczęście wszystkie są jednorodne, więc stworzenie docelowej bazy danych i zmodyfikowanie samych schem dla ładowania można zrealizować przy pomocy kilku niezbyt skomplikowanych zapytań.

1. Utworzymy pustą bazę FIAS2.
Dlaczego "2"? Cóż, dlatego że "1" to była baza z plików dbf. Może później o niej porozmawiamy.

Skrypt tworzenia bazy danych FIAS2

CREATE DATABASE [FIAS2]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'FIAS', FILENAME = N'E:DataFIAS1.mdf' , SIZE = 10485760KB , FILEGROWTH = 1048576KB )
 LOG ON 
( NAME = N'FIAS_log', FILENAME = N'E:DataFIAS1_log.ldf' , SIZE = 1048576KB , FILEGROWTH = 131072KB )
GO
ALTER DATABASE [FIAS2] SET COMPATIBILITY_LEVEL = 120
GO
ALTER DATABASE [FIAS2] SET ANSI_NULL_DEFAULT ON 
GO
ALTER DATABASE [FIAS2] SET ANSI_NULLS ON 
GO
ALTER DATABASE [FIAS2] SET ANSI_PADDING ON 
GO
ALTER DATABASE [FIAS2] SET ANSI_WARNINGS ON 
GO
ALTER DATABASE [FIAS2] SET ARITHABORT OFF 
GO
ALTER DATABASE [FIAS2] SET AUTO_CLOSE OFF 
GO
ALTER DATABASE [FIAS2] SET AUTO_SHRINK OFF 
GO
ALTER DATABASE [FIAS2] SET AUTO_CREATE_STATISTICS ON(INCREMENTAL = OFF)
GO
ALTER DATABASE [FIAS2] SET AUTO_UPDATE_STATISTICS ON 
GO
ALTER DATABASE [FIAS2] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO
ALTER DATABASE [FIAS2] SET CURSOR_DEFAULT  GLOBAL 
GO
ALTER DATABASE [FIAS2] SET CONCAT_NULL_YIELDS_NULL ON 
GO
ALTER DATABASE [FIAS2] SET NUMERIC_ROUNDABORT OFF 
GO
ALTER DATABASE [FIAS2] SET QUOTED_IDENTIFIER ON 
GO
ALTER DATABASE [FIAS2] SET RECURSIVE_TRIGGERS OFF 
GO
ALTER DATABASE [FIAS2] SET  DISABLE_BROKER 
GO
ALTER DATABASE [FIAS2] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO
ALTER DATABASE [FIAS2] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO
ALTER DATABASE [FIAS2] SET PARAMETERIZATION SIMPLE 
GO
ALTER DATABASE [FIAS2] SET READ_COMMITTED_SNAPSHOT ON 
GO
ALTER DATABASE [FIAS2] SET  READ_WRITE 
GO
ALTER DATABASE [FIAS2] SET RECOVERY SIMPLE 
GO
ALTER DATABASE [FIAS2] SET  MULTI_USER 
GO
ALTER DATABASE [FIAS2] SET PAGE_VERIFY CHECKSUM  
GO
ALTER DATABASE [FIAS2] SET TARGET_RECOVERY_TIME = 0 SECONDS 
GO
ALTER DATABASE [FIAS2] SET DELAYED_DURABILITY = DISABLED 
GO
USE [FIAS2]
GO
IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N'PRIMARY') ALTER DATABASE [FIAS2] MODIFY FILEGROUP [PRIMARY] DEFAULT
GO

2. Utworzymy w tej bazie kilka tabel.

Pierwsza tabela będzie zawierać schemy xsd, a druga będzie faktycznie przedstawiać schemę danych uzyskaną z tych schem xsd.

Schemy xsd to w zasadzie zwykłe pliki xml, więc można z nimi pracować jak z normalnymi plikami xml.

UŻYJ [FIAS2]
przejdź

jeżeli OBJECT_ID('dbo.[_FIAS]') nie jest nullem 
	drop table dbo.[_FIAS]
przejdź

jeżeli OBJECT_ID('dbo._FIAS_SCHEMAS') nie jest nullem 
	drop table dbo.[_FIAS_SCHEMAS]
przejdź

Utwórz tabelę dbo.[_FIAS_SCHEMAS] (x xml, [tabela "" nie znaleziona \/]
sysname) przejdź -- Pierwsze zapytanie: Załadujemy schematy do tabeli na serwerze, do dalszych manipulacji. insert into dbo.[_FIAS_SCHEMAS] (x, [tabela "" nie znaleziona \/]
) WYBIERZ x = CAST(BulkColumn AS XML).query('.'), '_ACTSTAT' [tabela "" nie znaleziona \/]
Z OPENROWSET(BULK 's01sq03c$filesFIASAS_ACTSTAT_2_250_08_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_ADDROBJ' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_ADDROBJ_2_250_01_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_CENTERST' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_CENTERST_2_250_10_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_CURENTST' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_CURENTST_2_250_07_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_DEL_ADDROBJ' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_DEL_ADDROBJ_2_250_15_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_DEL_HOUSEINT' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_DEL_HOUSEINT_2_250_17_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_DEL_HOUSE' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_DEL_HOUSE_2_250_16_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_DEL_LANDMARK' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_DEL_LANDMARK_2_250_18_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_DEL_NORMDOC' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_DEL_NORMDOC_2_250_19_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_ESTSTAT' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_ESTSTAT_2_250_13_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_FLATTYPE' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_FLATTYPE_2_250_23_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_HOUSEINT' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_HOUSEINT_2_250_03_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_HOUSE' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_HOUSE_2_250_02_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_HSTSTAT' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_HSTSTAT_2_250_12_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_INTVSTAT' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_INTVSTAT_2_250_11_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_LANDMARK' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_LANDMARK_2_250_04_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_NDOCTYPE' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_NDOCTYPE_2_250_20_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_NORMDOC' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_NORMDOC_2_250_05_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_OPERSTAT' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_OPERSTAT_2_250_09_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_ROOMTYPE' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_ROOMTYPE_2_250_24_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_ROOM' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_ROOM_2_250_21_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_SOCRBASE' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_SOCRBASE_2_250_06_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_STEAD' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_STEAD_2_250_22_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_STRSTAT' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_STRSTAT_2_250_14_04_01_01.xsd', SINGLE_BLOB) x -- Drugi zapytanie: Rozbijemy schemy i stworzymy roboczą tabelę z metadanymi ;WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema' as xs) Select a.[table "" not found /]
,tbl.[root_name] ,tbl.[root_description] ,tbl.[name] ,ROW_NUMBER() over (partition by a.[table "" not found "]
order by 1/0) N ,tbl.[column] ,tbl.[required] ,tbl.[description] ,tbl.[type] ,tbl.[len] ,Case tbl.[type] when N'byte' then N'tinyint' when N'date' then N'date' when N'int' then N'int' when N'string' then Case when tbl.[len] = 36 and (tbl.[column] like N'%ID' or tbl.[column] = N'NORMDOC') then N'uniqueidentifier' when tbl.[len] is Null then N'nvarchar(max)' Else N'nvarchar(' + cast(tbl.[len] as nvarchar(4000)) + N')' END when N'integer' then Case when tbl.[len] > 9 then N'bigint' when tbl.[len] <= 4 then N'smallint' Else N'int' end else N'nvarchar(max)' End [sqltype] ,t.n.query('.') [node] into dbo.[_FIAS] from dbo.[_FIAS_SCHEMAS] a Cross apply a.x.nodes('//xs:attribute') t(n) Cross apply (values -- some fields are used multiple times, so we will do it this way :) ( x.value('(xs:schema[1]/xs:element[1]/@name)', 'nvarchar(255)') ,x.value('(xs:schema[1]/xs:element[1]/xs:annotation/xs:documentation[1]/text())[1]', 'nvarchar(4000)') ,x.value('(xs:schema[1]/xs:element[1]/xs:complexType[1]/xs:sequence[1]/xs:element[1]/@name)', 'nvarchar(255)') ,t.n.value('(.//@name)[1]', 'nvarchar(255)') ,t.n.value('(.//@use)[1]', 'nvarchar(255)') ,Stuff(Coalesce(t.n.value('(.//xs:simpleType/xs:restriction/@base)[1]', 'nvarchar(255)'), t.n.value('(.//@type)[1]', 'nvarchar(255)')), 1, 3, '') ,Coalesce(t.n.value('(.//xs:simpleType/xs:restriction/xs:length/@value)[1]', 'int') ,t.n.value('(.//xs:simpleType/xs:restriction/xs:maxLength/@value)[1]', 'int') ,t.n.value('(.//xs:simpleType/xs:restriction/xs:totalDigits/@value)[1]', 'int')) ,Replace( Replace( Replace( Replace( Replace( Replace( Replace( Replace( Replace(t.n.value('(.//xs:annotation/xs:documentation)[1]', 'nvarchar(4000)'), ' ', ' ') , ' ', ' ') , ' ', ' ') , ' ', ' ') , ' ', ' ') , ' ', ' ') , ' ', ' ') , ' ', ' ') , ' ', ' ') ) ) tbl([root_name], [root_description], [name], [column], [required], [type], [len], [description]) -- Let's see the result Select * from dbo.[_FIAS]

Szczegóły dotyczące zapytań:

Pierwsze – ładuje schemy xsd do tabeli na serwerze, jednocześnie dostarczając każdej schemie adnotację w polu [table "" not found \/]
– nazwą tabeli, do której chcę ładować dane z odpowiedniej tabeli.

Oczywiście, można by zrobić tak, że za każdym razem, gdy schemy się zmienią, można je pobierać, wsadzać do jakiegoś folderu i na ich podstawie automatycznie odtwarzać strukturę tabel docelowych, a także je automatycznie modyfikować. Jednakże, ponieważ struktura zmienia się niezwykle rzadko, ostatni raz miało to miejsce aż w 2016 roku, tworzenie takiej automatyzacji wydaje się zbytnim wysiłkiem. Lepiej poświęcić 30 sekund na CTRL+C – CTRL+V.

Dlatego ładowanie do tabeli ze schematami jest tak sztywno zakodowane, a ścieżki do plików do załadowania oraz nazwy tabel zostały wpisane ręcznie.

Drugi zapytanie – wyciąga z schematu informacje na temat struktury tabel. Nie bawiłem się w 3NF, tylko rozwijałem to jako jedną tabelę.

Zwróć uwagę na ten fragment (+)

Dość często nowicjusze pytają: czy można obliczyć jakieś złożone wyrażenie w zapytaniu raz, a następnie wielokrotnie używać go w kilku miejscach. Tak, można. Na przykład w ten sposób:

from dbo.[_FIAS_SCHEMAS] a
	Cross apply a.x.nodes('\\xs:attribute') t(n)
	Cross apply 
			(values -- niektóre pola są używane kilka razy, więc zrobimy tak :) 
			(
			 x.value('(xs:schema[1]\/xs:element[1]\/@name)', 'nvarchar(255)')
, ... tutaj można wymienić wszystkie trudne do obliczenia pola, aby later użyć ich w dowolnej części zapytania
			)
			) tbl([root_name], [root_description], [name], [column], [required], [type], [len], [description])

Działa z pewnymi ograniczeniami, oczywiście. Ale po rozpoczęciu użytkowania szybko zrozumiesz, na czym one polegają.

3. Stworzymy skrypty, które stworzą tabele FIAS, a następnie je uruchomimy, aby stworzyć same tabele:


Zadeklaruj @schema sysname jako N'dbo'
Zadeklaruj @sql nvarchar(max)

-- Utworzymy kod do tworzenia tabel i go uruchomimy
set @sql = (
	Select Distinct 
		N';Utwórz tabelę ' 
		+ Quotename(@schema)
		+ N'.'
		+ Quotename([table “” not found \/]
) + N'(' + Stuff((Select N',' + QUOTENAME(b.[column]) + N' ' + b.[sqltype] + Case b.[required] kiedy 'required' wtedy N' NOT NULL' kiedy 'optional' wtedy N' NULL' Koniec Z dbo.[_FIAS] b gdzie b.[table “” not found \/]
= a.[table “” not found \/]
Order by N ASC For xml path(N''), type ).value(N'.', 'nvarchar(max)'), 1, 1, N'') + N')' z dbo.[_FIAS] a For xml path(N''), type).value(N'.', N'nvarchar(max)') exec (@sql)

Dla tych, którzy nie chcą tego wykonywać – skrypty do tworzenia tabel i adnotowane schemy FIAS będą dołączone na końcu artykułu.

Zapytanie do tworzenia tabel, które zostało uzyskane w wyniku działania zapytania

;

UTWÓRZ TABELĘ [dbo].[_ACTSTAT] (
	[NAME] NVARCHAR(100) NOT NULL
	,[ACTSTATID] BIGINT NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_ADDROBJ] (
	[AOGUID] UNIQUEIDENTIFIER NOT NULL
	,[FORMALNAME] NVARCHAR(120) NOT NULL
	,[REGIONCODE] NVARCHAR(2) NOT NULL
	,[AUTOCODE] NVARCHAR(1) NOT NULL
	,[AREACODE] NVARCHAR(3) NOT NULL
	,[CITYCODE] NVARCHAR(3) NOT NULL
	,[CTARCODE] NVARCHAR(3) NOT NULL
	,[PLACECODE] NVARCHAR(3) NOT NULL
	,[PLANCODE] NVARCHAR(4) NOT NULL
	,[STREETCODE] NVARCHAR(4) NULL
	,[EXTRCODE] NVARCHAR(4) NOT NULL
	,[SEXTCODE] NVARCHAR(3) NOT NULL
	,[OFFNAME] NVARCHAR(120) NULL
	,[POSTALCODE] NVARCHAR(6) NULL
	,[IFNSFL] NVARCHAR(4) NULL
	,[TERRIFNSFL] NVARCHAR(4) NULL
	,[IFNSUL] NVARCHAR(4) NULL
	,[TERRIFNSUL] NVARCHAR(4) NULL
	,[OKATO] NVARCHAR(11) NULL
	,[UPDATEDATE] DATE NOT NULL
	,[SHORTNAME] NVARCHAR(10) NOT NULL
	,[AOLEVEL] BIGINT NOT NULL
	,[PARENTGUID] UNIQUEIDENTIFIER NULL
	,[AOID] UNIQUEIDENTIFIER NOT NULL
	,[PREVID] UNIQUEIDENTIFIER NULL
	,[NEXTID] UNIQUEIDENTIFIER NULL
	,[CODE] NVARCHAR(17) NULL
	,[PLAINCODE] NVARCHAR(15) NULL
	,[ACTSTATUS] BIGINT NOT NULL
	,[CENTSTATUS] BIGINT NOT NULL
	,[OPERSTATUS] BIGINT NOT NULL
	,[CURRSTATUS] BIGINT NOT NULL
	,[STARTDATE] DATE NOT NULL
	,[ENDDATE] DATE NOT NULL
	,[NORMDOC] UNIQUEIDENTIFIER NULL
	,[LIVESTATUS] TINYINT NOT NULL
	,[DIVTYPE] INT NOT NULL
	,[OKTMO] NVARCHAR(11) NULL
	);

UTWÓRZ TABELĘ [dbo].[_CENTERST] (
	[CENTERSTID] BIGINT NOT NULL
	,[NAME] NVARCHAR(100) NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_CURENTST] (
	[CURENTSTID] BIGINT NOT NULL
	,[NAME] NVARCHAR(100) NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_DEL_ADDROBJ] (
	[AOGUID] UNIQUEIDENTIFIER NOT NULL
	,[FORMALNAME] NVARCHAR(120) NOT NULL
	,[REGIONCODE] NVARCHAR(2) NOT NULL
	,[AUTOCODE] NVARCHAR(1) NOT NULL
	,[AREACODE] NVARCHAR(3) NOT NULL
	,[CITYCODE] NVARCHAR(3) NOT NULL
	,[CTARCODE] NVARCHAR(3) NOT NULL
	,[PLACECODE] NVARCHAR(3) NOT NULL
	,[STREETCODE] NVARCHAR(4) NULL
	,[EXTRCODE] NVARCHAR(4) NOT NULL
	,[PLANCODE] NVARCHAR(4) NOT NULL
	,[SEXTCODE] NVARCHAR(3) NOT NULL
	,[OFFNAME] NVARCHAR(120) NULL
	,[POSTALCODE] NVARCHAR(6) NULL
	,[SHORTNAME] NVARCHAR(10) NOT NULL
	,[AOLEVEL] BIGINT NOT NULL
	,[PARENTGUID] UNIQUEIDENTIFIER NULL
	,[AOID] UNIQUEIDENTIFIER NOT NULL
	,[PREVID] UNIQUEIDENTIFIER NULL
	,[NEXTID] UNIQUEIDENTIFIER NULL
	,[CODE] NVARCHAR(17) NULL
	,[PLAINCODE] NVARCHAR(15) NULL
	,[ACTSTATUS] BIGINT NOT NULL
	,[CENTSTATUS] BIGINT NOT NULL
	,[OPERSTATUS] BIGINT NOT NULL
	,[CURRSTATUS] BIGINT NOT NULL
	,[STARTDATE] DATE NOT NULL
	,[ENDDATE] DATE NOT NULL
	,[NORMDOC] UNIQUEIDENTIFIER NULL
	,[LIVESTATUS] TINYINT NOT NULL
	,[IFNSFL] NVARCHAR(4) NULL
	,[TERRIFNSFL] NVARCHAR(4) NULL
	,[IFNSUL] NVARCHAR(4) NULL
	,[TERRIFNSUL] NVARCHAR(4) NULL
	,[OKATO] NVARCHAR(11) NULL
	,[OKTMO] NVARCHAR(11) NULL
	,[UPDATEDATE] DATE NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_DEL_HOUSE] (
	[POSTALCODE] NVARCHAR(6) NULL
	,[IFNSFL] NVARCHAR(4) NULL
	,[TERRIFNSFL] NVARCHAR(4) NULL
	,[IFNSUL] NVARCHAR(4) NULL
	,[TERRIFNSUL] NVARCHAR(4) NULL
	,[OKATO] NVARCHAR(11) NULL
	,[OKTMO] NVARCHAR(11) NULL
	,[UPDATEDATE] DATE NOT NULL
	,[HOUSENUM] NVARCHAR(20) NULL
	,[ESTSTATUS] SMALLINT NOT NULL
	,[BUILDNUM] NVARCHAR(10) NULL
	,[STRUCNUM] NVARCHAR(10) NULL
	,[STRSTATUS] BIGINT NULL
	,[HOUSEID] UNIQUEIDENTIFIER NOT NULL
	,[HOUSEGUID] UNIQUEIDENTIFIER NOT NULL
	,[AOGUID] UNIQUEIDENTIFIER NOT NULL
	,[STARTDATE] DATE NOT NULL
	,[ENDDATE] DATE NOT NULL
	,[STATSTATUS] BIGINT NOT NULL
	,[NORMDOC] UNIQUEIDENTIFIER NULL
	,[COUNTER] BIGINT NOT NULL
	,[CADNUM] NVARCHAR(100) NULL
	,[DIVTYPE] INT NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_DEL_HOUSEINT] (
	[IFNSUL] NVARCHAR(4) NULL
	,[TERRIFNSUL] NVARCHAR(4) NULL
	,[OKATO] NVARCHAR(11) NULL
	,[OKTMO] NVARCHAR(11) NULL
	,[UPDATEDATE] DATE NOT NULL
	,[INTSTART] BIGINT NOT NULL
	,[INTEND] BIGINT NOT NULL
	,[POSTALCODE] NVARCHAR(6) NULL
	,[IFNSFL] NVARCHAR(4) NULL
	,[TERRIFNSFL] NVARCHAR(4) NULL
	,[HOUSEINTID] UNIQUEIDENTIFIER NOT NULL
	,[INTGUID] UNIQUEIDENTIFIER NOT NULL
	,[AOGUID] UNIQUEIDENTIFIER NOT NULL
	,[STARTDATE] DATE NOT NULL
	,[ENDDATE] DATE NOT NULL
	,[INTSTATUS] BIGINT NOT NULL
	,[NORMDOC] UNIQUEIDENTIFIER NULL
	,[COUNTER] BIGINT NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_DEL_LANDMARK] (
	[LOCATION] NVARCHAR(500) NOT NULL
	,[POSTALCODE] NVARCHAR(6) NULL
	,[IFNSFL] NVARCHAR(4) NULL
	,[TERRIFNSFL] NVARCHAR(4) NULL
	,[IFNSUL] NVARCHAR(4) NULL
	,[TERRIFNSUL] NVARCHAR(4) NULL
	,[OKATO] NVARCHAR(11) NULL
	,[OKTMO] NVARCHAR(11) NULL
	,[UPDATEDATE] DATE NOT NULL
	,[LANDID] UNIQUEIDENTIFIER NOT NULL
	,[LANDGUID] UNIQUEIDENTIFIER NOT NULL
	,[AOGUID] UNIQUEIDENTIFIER NOT NULL
	,[STARTDATE] DATE NOT NULL
	,[ENDDATE] DATE NOT NULL
	,[NORMDOC] UNIQUEIDENTIFIER NULL
	);

UTWÓRZ TABELĘ [dbo].[_DEL_NORMDOC] (
	[NORMDOCID] UNIQUEIDENTIFIER NOT NULL
	,[DOCNAME] NVARCHAR(max) NULL
	,[DOCDATE] DATE NULL
	,[DOCNUM] NVARCHAR(20) NULL
	,[DOCTYPE] BIGINT NOT NULL
	,[DOCIMGID] UNIQUEIDENTIFIER NULL
	);

UTWÓRZ TABELĘ [dbo].[_ESTSTAT] (
	[ESTSTATID] BIGINT NOT NULL
	,[NAME] NVARCHAR(20) NOT NULL
	,[SHORTNAME] NVARCHAR(20) NULL
	);

UTWÓRZ TABELĘ [dbo].[_FLATTYPE] (
	[SHORTNAME] NVARCHAR(20) NULL
	,[FLTYPEID] BIGINT NOT NULL
	,[NAME] NVARCHAR(20) NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_HOUSE] (
	[POSTALCODE] NVARCHAR(6) NULL
	,[REGIONCODE] NVARCHAR(2) NULL
	,[IFNSFL] NVARCHAR(4) NULL
	,[TERRIFNSFL] NVARCHAR(4) NULL
	,[IFNSUL] NVARCHAR(4) NULL
	,[TERRIFNSUL] NVARCHAR(4) NULL
	,[OKATO] NVARCHAR(11) NULL
	,[OKTMO] NVARCHAR(11) NULL
	,[UPDATEDATE] DATE NOT NULL
	,[HOUSENUM] NVARCHAR(20) NULL
	,[ESTSTATUS] SMALLINT NOT NULL
	,[BUILDNUM] NVARCHAR(10) NULL
	,[STRUCNUM] NVARCHAR(10) NULL
	,[STRSTATUS] BIGINT NULL
	,[HOUSEID] UNIQUEIDENTIFIER NOT NULL
	,[HOUSEGUID] UNIQUEIDENTIFIER NOT NULL
	,[AOGUID] UNIQUEIDENTIFIER NOT NULL
	,[STARTDATE] DATE NOT NULL
	,[ENDDATE] DATE NOT NULL
	,[STATSTATUS] BIGINT NOT NULL
	,[NORMDOC] UNIQUEIDENTIFIER NULL
	,[COUNTER] BIGINT NOT NULL
	,[CADNUM] NVARCHAR(100) NULL
	,[DIVTYPE] INT NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_HOUSEINT] (
	[OKTMO] NVARCHAR(11) NULL
	,[OKATO] NVARCHAR(11) NULL
	,[IFNSUL] NVARCHAR(4) NULL
	,[TERRIFNSUL] NVARCHAR(4) NULL
	,[TERRIFNSFL] NVARCHAR(4) NULL
	,[POSTALCODE] NVARCHAR(6) NULL
	,[IFNSFL] NVARCHAR(4) NULL
	,[ENDDATE] DATE NOT NULL
	,[INTSTATUS] BIGINT NOT NULL
	,[AOGUID] UNIQUEIDENTIFIER NOT NULL
	,[STARTDATE] DATE NOT NULL
	,[INTGUID] UNIQUEIDENTIFIER NOT NULL
	,[HOUSEINTID] UNIQUEIDENTIFIER NOT NULL
	,[INTSTART] BIGINT NOT NULL
	,[INTEND] BIGINT NOT NULL
	,[UPDATEDATE] DATE NOT NULL
	,[NORMDOC] UNIQUEIDENTIFIER NULL
	,[COUNTER] BIGINT NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_HSTSTAT] (
	[HOUSESTID] BIGINT NOT NULL
	,[NAME] NVARCHAR(60) NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_INTVSTAT] (
	[INTVSTATID] BIGINT NOT NULL
	,[NAME] NVARCHAR(60) NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_LANDMARK] (
	[NORMDOC] UNIQUEIDENTIFIER NULL
	,[STARTDATE] DATE NOT NULL
	,[ENDDATE] DATE NOT NULL
	,[LANDGUID] UNIQUEIDENTIFIER NOT NULL
	,[AOGUID] UNIQUEIDENTIFIER NOT NULL
	,[LANDID] UNIQUEIDENTIFIER NOT NULL
	,[LOCATION] NVARCHAR(500) NOT NULL
	,[POSTALCODE] NVARCHAR(6) NULL
	,[TERRIFNSFL] NVARCHAR(4) NULL
	,[IFNSFL] NVARCHAR(4) NULL
	,[UPDATEDATE] DATE NOT NULL
	,[OKTMO] NVARCHAR(11) NULL
	,[OKATO] NVARCHAR(11) NULL
	,[IFNSUL] NVARCHAR(4) NULL
	,[TERRIFNSUL] NVARCHAR(4) NULL
	);

UTWÓRZ TABELĘ [dbo].[_NDOCTYPE] (
	[NDTYPEID] BIGINT NOT NULL
	,[NAME] NVARCHAR(250) NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_NORMDOC] (
	[NORMDOCID] UNIQUEIDENTIFIER NOT NULL
	,[DOCNAME] NVARCHAR(max) NULL
	,[DOCDATE] DATE NULL
	,[DOCNUM] NVARCHAR(20) NULL
	,[DOCTYPE] BIGINT NOT NULL
	,[DOCIMGID] UNIQUEIDENTIFIER NULL
	);

UTWÓRZ TABELĘ [dbo].[_OPERSTAT] (
	[OPERSTATID] BIGINT NOT NULL
	,[NAME] NVARCHAR(100) NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_ROOM] (
	[ROOMGUID] UNIQUEIDENTIFIER NOT NULL
	,[FLATNUMBER] NVARCHAR(50) NOT NULL
	,[FLATTYPE] INT NOT NULL
	,[ROOMNUMBER] NVARCHAR(50) NULL
	,[ROOMTYPE] INT NULL
	,[REGIONCODE] NVARCHAR(2) NOT NULL
	,[POSTALCODE] NVARCHAR(6) NULL
	,[UPDATEDATE] DATE NOT NULL
	,[HOUSEGUID] UNIQUEIDENTIFIER NOT NULL
	,[ROOMID] UNIQUEIDENTIFIER NOT NULL
	,[PREVID] UNIQUEIDENTIFIER NULL
	,[NEXTID] UNIQUEIDENTIFIER NULL
	,[STARTDATE] DATE NOT NULL
	,[ENDDATE] DATE NOT NULL
	,[LIVESTATUS] TINYINT NOT NULL
	,[NORMDOC] UNIQUEIDENTIFIER NULL
	,[OPERSTATUS] BIGINT NOT NULL
	,[CADNUM] NVARCHAR(100) NULL
	,[ROOMCADNUM] NVARCHAR(100) NULL
	);

UTWÓRZ TABELĘ [dbo].[_ROOMTYPE] (
	[SHORTNAME] NVARCHAR(20) NULL
	,[NAME] NVARCHAR(20) NOT NULL
	,[RMTYPEID] BIGINT NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_SOCRBASE] (
	[LEVEL] BIGINT NOT NULL
	,[SCNAME] NVARCHAR(10) NULL
	,[SOCRNAME] NVARCHAR(50) NOT NULL
	,[KOD_T_ST] NVARCHAR(4) NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_STEAD] (
	[STEADGUID] UNIQUEIDENTIFIER NOT NULL
	,[NUMBER] NVARCHAR(120) NULL
	,[REGIONCODE] NVARCHAR(2) NOT NULL
	,[POSTALCODE] NVARCHAR(6) NULL
	,[IFNSFL] NVARCHAR(4) NULL
	,[TERRIFNSFL] NVARCHAR(4) NULL
	,[IFNSUL] NVARCHAR(4) NULL
	,[TERRIFNSUL] NVARCHAR(4) NULL
	,[OKATO] NVARCHAR(11) NULL
	,[OKTMO] NVARCHAR(11) NULL
	,[UPDATEDATE] DATE NOT NULL
	,[PARENTGUID] UNIQUEIDENTIFIER NULL
	,[STEADID] UNIQUEIDENTIFIER NOT NULL
	,[PREVID] UNIQUEIDENTIFIER NULL
	,[NEXTID] UNIQUEIDENTIFIER NULL
	,[OPERSTATUS] BIGINT NOT NULL
	,[STARTDATE] DATE NOT NULL
	,[ENDDATE] DATE NOT NULL
	,[NORMDOC] UNIQUEIDENTIFIER NULL
	,[LIVESTATUS] TINYINT NOT NULL
	,[CADNUM] NVARCHAR(100) NULL
	,[DIVTYPE] INT NOT NULL
	);

UTWÓRZ TABELĘ [dbo].[_STRSTAT] (
	[NAME] NVARCHAR(20) NOT NULL
	,[SHORTNAME] NVARCHAR(20) NULL
	,[STRSTATID] BIGINT NOT NULL
	)

4. Skoro w xsd jest normalny opis tabel i pól w nich – wykorzystujemy go i stworzymy opis struktury w rozszerzonych właściwościach tabel i ich pól:

-- Stworzymy adnotację do tabel i pól
Set @sql = (
Select N'; exec sp_addextendedproperty @name=''description'', @value=N''' 
		+ a.[root_description] 
		+ N''', @level0type =N''Schema'', @level0name = N''' 
		+ @schema 
		+ N''', @level1type = N''Table'',  @level1name = N''' 
		+ a.[table “” not found \/]
+ N'''' from (Select distinct [table “” not found \/]
, [root_description] from dbo.[_FIAS]) a for xml path(N''), type ).value(N'.', N'nvarchar(max)') exec (@sql) Set @sql = ( Select N'; exec sp_addextendedproperty @name=''description'', @value=N''' + a.[description] + N''', @level0type =N''Schema'', @level0name = N''' + @schema + N''', @level1type = N''Table'', @level1name = N''' + a.[table “” not found \/]
+ N''', @level2type = N''Column'', @level2name = N''' + a.[column] + N'''' from dbo.[_FIAS] a for xml path(N''), type ).value(N'.', N'nvarchar(max)') exec (@sql)

Oto kod, który uzyskaliśmy i który wykonał się w wyniku pracy

;

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по статусу актуальности в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ACTSTAT';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией классификатора адресообразующих элементов БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по статусу центра в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_CENTERST';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по статусу актуальности КЛАДР 4.0 в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_CURENTST';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией классификатора адресообразующих элементов БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по номерам домов улиц городов и населенных пунктов, номера земельных участков и т.п в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по интервалам домов в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по описанию мест расположения  имущественных объектов в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по сведениям по нормативным документам, являющимся основанием присвоения адресному элементу наименования в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_NORMDOC';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по признакам владения в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ESTSTAT';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по типам помещений в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_FLATTYPE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по номерам домов улиц городов и населенных пунктов в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по интервалам домов в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по статусу состояния домов  в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HSTSTAT';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по статусу интервалов домов в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_INTVSTAT';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по описанию мест расположения  имущественных объектов в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по типу нормативного документа в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_NDOCTYPE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по сведениям по нормативным документам, являющимся основанием присвоения адресному элементу наименования в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_NORMDOC';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по статусу действия в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_OPERSTAT';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла со сведениями о помещениях'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по типам комнат в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOMTYPE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по типам адресных объектов в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_SOCRBASE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла со сведениями о земельных участках'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состав и структура файла с информацией по признакам строения в БД ФИАС'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STRSTAT'

;

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Глобальный уникальный идентификатор адресного объекта '
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'AOGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Формализованное наименование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'FORMALNAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код региона'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'REGIONCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код автономии'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'AUTOCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код района'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'AREACODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код города'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'CITYCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код внутригородского района'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'CTARCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код населенного пункта'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'PLACECODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код элемента планировочной структуры'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'PLANCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код улицы'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'STREETCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код дополнительного адресообразующего элемента'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'EXTRCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код подчиненного дополнительного адресообразующего элемента'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'SEXTCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Официальное наименование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'OFFNAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Почтовый индекс'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'POSTALCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'IFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'IFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKATO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'OKATO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Дата внесения записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'UPDATEDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Краткое наименование типа объекта'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'SHORTNAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Уровень адресного объекта '
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'AOLEVEL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор объекта родительского объекта'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'PARENTGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Уникальный идентификатор записи. Ключевое поле.'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'AOID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор записи связывания с предыдушей исторической записью'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'PREVID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор записи связывания с последующей исторической записью'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'NEXTID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код адресного объекта одной строкой с признаком актуальности из КЛАДР 4.0. '
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'CODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код адресного объекта из КЛАДР 4.0 одной строкой без признака актуальности (последних двух цифр)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'PLAINCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Статус актуальности адресного объекта ФИАС. Актуальный адрес на текущую дату. Обычно последняя запись об адресном объекте.
0 – Не актуальный
1 - Актуальный
'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'ACTSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Статус центра'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'CENTSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Статус действия над записью – причина появления записи (см. описание таблицы OperationStatus):
01 – Инициация;
10 – Добавление;
20 – Изменение;
21 – Групповое изменение;
30 – Удаление;
31 - Удаление вследствие удаления вышестоящего объекта;
40 – Присоединение адресного объекта (слияние);
41 – Переподчинение вследствие слияния вышестоящего объекта;
42 - Прекращение существования вследствие присоединения к другому адресному объекту;
43 - Создание нового адресного объекта в результате слияния адресных объектов;
50 – Переподчинение;
51 – Переподчинение вследствие переподчинения вышестоящего объекта;
60 – Прекращение существования вследствие дробления;
61 – Создание нового адресного объекта в результате дробления
'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'OPERSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Статус актуальности КЛАДР 4 (последние две цифры в коде)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'CURRSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Начало действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'STARTDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Окончание действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'ENDDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Внешний ключ на нормативный документ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'NORMDOC';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Признак действующего адресного объекта'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'LIVESTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'
 Тип адресации:
 0 - не определено
 1 - муниципальный;
 2 - административно-территориальный
 '
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'DIVTYPE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKTMO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'OKTMO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор статуса (ключ)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_CURENTST'
	,@level2type = N'Column'
	,@level2name = N'CURENTSTID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Наименование (0 - актуальный, 1-50, 2-98 – исторический (кроме 51), 51 - переподчиненный, 99 - несуществующий)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_CURENTST'
	,@level2type = N'Column'
	,@level2name = N'NAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Краткое наименование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_FLATTYPE'
	,@level2type = N'Column'
	,@level2name = N'SHORTNAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Тип помещения'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_FLATTYPE'
	,@level2type = N'Column'
	,@level2name = N'FLTYPEID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Наименование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_FLATTYPE'
	,@level2type = N'Column'
	,@level2name = N'NAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор статуса'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HSTSTAT'
	,@level2type = N'Column'
	,@level2name = N'HOUSESTID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Наименование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HSTSTAT'
	,@level2type = N'Column'
	,@level2name = N'NAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор записи (ключ)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_NDOCTYPE'
	,@level2type = N'Column'
	,@level2name = N'NDTYPEID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Наименование типа нормативного документа'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_NDOCTYPE'
	,@level2type = N'Column'
	,@level2name = N'NAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор статуса (ключ)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_OPERSTAT'
	,@level2type = N'Column'
	,@level2name = N'OPERSTATID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Наименование
01 – Инициация;
10 – Добавление;
20 – Изменение;
21 – Групповое изменение;
30 – Удаление;
31 - Удаление вследствие удаления вышестоящего объекта;
40 – Присоединение адресного объекта (слияние);
41 – Переподчинение вследствие слияния вышестоящего объекта;
42 - Прекращение существования вследствие присоединения к другому адресному объекту;
43 - Создание нового адресного объекта в результате слияния адресных объектов;
50 – Переподчинение;
51 – Переподчинение вследствие переподчинения вышестоящего объекта;
60 – Прекращение существования вследствие дробления;
61 – Создание нового адресного объекта в результате дробления;
70 – Восстановление объекта прекратившего существование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_OPERSTAT'
	,@level2type = N'Column'
	,@level2name = N'NAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Глобальный уникальный идентификатор адресного объекта '
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'AOGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Формализованное наименование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'FORMALNAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код региона'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'REGIONCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код автономии'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'AUTOCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код района'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'AREACODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код города'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'CITYCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код внутригородского района'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'CTARCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код населенного пункта'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'PLACECODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код улицы'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'STREETCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код дополнительного адресообразующего элемента'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'EXTRCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код элемента планировочной структуры'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'PLANCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код подчиненного дополнительного адресообразующего элемента'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'SEXTCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Официальное наименование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'OFFNAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Почтовый индекс'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'POSTALCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Краткое наименование типа объекта'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'SHORTNAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Уровень адресного объекта '
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'AOLEVEL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор объекта родительского объекта'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'PARENTGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Уникальный идентификатор записи. Ключевое поле.'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'AOID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор записи связывания с предыдушей исторической записью'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'PREVID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор записи связывания с последующей исторической записью'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'NEXTID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код адресного объекта одной строкой с признаком актуальности из КЛАДР 4.0. '
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'CODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код адресного объекта из КЛАДР 4.0 одной строкой без признака актуальности (последних двух цифр)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'PLAINCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Статус актуальности адресного объекта ФИАС. Актуальный адрес на текущую дату. Обычно последняя запись об адресном объекте.
0 – Не актуальный
1 - Актуальный
'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'ACTSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Статус центра'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'CENTSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Статус действия над записью – причина появления записи (см. описание таблицы OperationStatus):
01 – Инициация;
10 – Добавление;
20 – Изменение;
21 – Групповое изменение;
30 – Удаление;
31 - Удаление вследствие удаления вышестоящего объекта;
40 – Присоединение адресного объекта (слияние);
41 – Переподчинение вследствие слияния вышестоящего объекта;
42 - Прекращение существования вследствие присоединения к другому адресному объекту;
43 - Создание нового адресного объекта в результате слияния адресных объектов;
50 – Переподчинение;
51 – Переподчинение вследствие переподчинения вышестоящего объекта;
60 – Прекращение существования вследствие дробления;
61 – Создание нового адресного объекта в результате дробления
'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'OPERSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Статус актуальности КЛАДР 4 (последние две цифры в коде)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'CURRSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Начало действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'STARTDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Окончание действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'ENDDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Внешний ключ на нормативный документ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'NORMDOC';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Признак действующего адресного объекта'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'LIVESTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'IFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'IFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKATO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'OKATO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKTMO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'OKTMO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Дата внесения записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_ADDROBJ'
	,@level2type = N'Column'
	,@level2name = N'UPDATEDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'IFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKATO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'OKATO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKTMO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'OKTMO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Дата внесения записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'UPDATEDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Значение начала интервала'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'INTSTART';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Значение окончания интервала'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'INTEND';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Почтовый индекс'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'POSTALCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'IFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор записи интервала домов'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'HOUSEINTID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Глобальный уникальный идентификатор интервала домов'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'INTGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор объекта родительского объекта (улицы, города, населенного пункта и т.п.)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'AOGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Начало действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'STARTDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Окончание действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'ENDDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Статус интервала (обычный, четный, нечетный)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'INTSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Внешний ключ на нормативный документ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'NORMDOC';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Счетчик записей домов для КЛАДР 4'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'COUNTER';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор нормативного документа'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_NORMDOC'
	,@level2type = N'Column'
	,@level2name = N'NORMDOCID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Наименование документа'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_NORMDOC'
	,@level2type = N'Column'
	,@level2name = N'DOCNAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Дата документа'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_NORMDOC'
	,@level2type = N'Column'
	,@level2name = N'DOCDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Номер документа'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_NORMDOC'
	,@level2type = N'Column'
	,@level2name = N'DOCNUM';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Тип документа'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_NORMDOC'
	,@level2type = N'Column'
	,@level2name = N'DOCTYPE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор образа (внешний ключ)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_NORMDOC'
	,@level2type = N'Column'
	,@level2name = N'DOCIMGID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKTMO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'OKTMO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKATO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'OKATO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'IFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Почтовый индекс'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'POSTALCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'IFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Окончание действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'ENDDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Статус интервала (обычный, четный, нечетный)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'INTSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор объекта родительского объекта (улицы, города, населенного пункта и т.п.)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'AOGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Начало действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'STARTDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Глобальный уникальный идентификатор интервала домов'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'INTGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор записи интервала домов'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'HOUSEINTID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Значение начала интервала'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'INTSTART';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Значение окончания интервала'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'INTEND';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Дата внесения записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'UPDATEDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Внешний ключ на нормативный документ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'NORMDOC';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Счетчик записей домов для КЛАДР 4'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSEINT'
	,@level2type = N'Column'
	,@level2name = N'COUNTER';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор статуса (обычный, четный, нечетный)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_INTVSTAT'
	,@level2type = N'Column'
	,@level2name = N'INTVSTATID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Наименование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_INTVSTAT'
	,@level2type = N'Column'
	,@level2name = N'NAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Внешний ключ на нормативный документ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'NORMDOC';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Начало действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'STARTDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Окончание действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'ENDDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Глобальный уникальный идентификатор ориентира'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'LANDGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Уникальный идентификатор родительского объекта (улицы, города, населенного пункта и т.п.)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'AOGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Уникальный идентификатор записи ориентира'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'LANDID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Месторасположение ориентира'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'LOCATION';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Почтовый индекс'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'POSTALCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'IFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Дата внесения записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'UPDATEDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKTMO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'OKTMO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKATO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'OKATO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'IFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор нормативного документа'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_NORMDOC'
	,@level2type = N'Column'
	,@level2name = N'NORMDOCID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Наименование документа'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_NORMDOC'
	,@level2type = N'Column'
	,@level2name = N'DOCNAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Дата документа'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_NORMDOC'
	,@level2type = N'Column'
	,@level2name = N'DOCDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Номер документа'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_NORMDOC'
	,@level2type = N'Column'
	,@level2name = N'DOCNUM';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Тип документа'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_NORMDOC'
	,@level2type = N'Column'
	,@level2name = N'DOCTYPE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор образа (внешний ключ)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_NORMDOC'
	,@level2type = N'Column'
	,@level2name = N'DOCIMGID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Краткое наименование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOMTYPE'
	,@level2type = N'Column'
	,@level2name = N'SHORTNAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Наименование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOMTYPE'
	,@level2type = N'Column'
	,@level2name = N'NAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Тип комнаты'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOMTYPE'
	,@level2type = N'Column'
	,@level2name = N'RMTYPEID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Уровень адресного объекта'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_SOCRBASE'
	,@level2type = N'Column'
	,@level2name = N'LEVEL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Краткое наименование типа объекта'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_SOCRBASE'
	,@level2type = N'Column'
	,@level2name = N'SCNAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Полное наименование типа объекта'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_SOCRBASE'
	,@level2type = N'Column'
	,@level2name = N'SOCRNAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Ключевое поле'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_SOCRBASE'
	,@level2type = N'Column'
	,@level2name = N'KOD_T_ST';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Наименование
0 – Не актуальный
1 – Актуальный (последняя запись по адресному объекту)
'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ACTSTAT'
	,@level2type = N'Column'
	,@level2name = N'NAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор статуса (ключ)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ACTSTAT'
	,@level2type = N'Column'
	,@level2name = N'ACTSTATID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор статуса'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_CENTERST'
	,@level2type = N'Column'
	,@level2name = N'CENTERSTID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Наименование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_CENTERST'
	,@level2type = N'Column'
	,@level2name = N'NAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Почтовый индекс'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'POSTALCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'IFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'IFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKATO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'OKATO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKTMO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'OKTMO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Дата время внесения записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'UPDATEDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Номер дома'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'HOUSENUM';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Признак владения'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'ESTSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Номер корпуса'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'BUILDNUM';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Номер строения'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'STRUCNUM';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Признак строения'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'STRSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Уникальный идентификатор записи дома'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'HOUSEID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Глобальный уникальный идентификатор дома'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'HOUSEGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Guid записи родительского объекта (улицы, города, населенного пункта и т.п.)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'AOGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Начало действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'STARTDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Окончание действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'ENDDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состояние дома'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'STATSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Внешний ключ на нормативный документ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'NORMDOC';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Счетчик записей домов для КЛАДР 4'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'COUNTER';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Кадастровый номер'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'CADNUM';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Тип адресации:
0 - не определено
1 - муниципальный;
2 - административно-территориальный'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'DIVTYPE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Признак владения'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ESTSTAT'
	,@level2type = N'Column'
	,@level2name = N'ESTSTATID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Наименование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ESTSTAT'
	,@level2type = N'Column'
	,@level2name = N'NAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Краткое наименование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ESTSTAT'
	,@level2type = N'Column'
	,@level2name = N'SHORTNAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Глобальный уникальный идентификатор адресного объекта (земельного участка)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'STEADGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Номер земельного участка'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'NUMBER';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код региона'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'REGIONCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Почтовый индекс'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'POSTALCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'IFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'IFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKATO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'OKATO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKTMO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'OKTMO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Дата внесения записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'UPDATEDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор объекта родительского объекта'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'PARENTGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Уникальный идентификатор записи. Ключевое поле.'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'STEADID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор записи связывания с предыдушей исторической записью'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'PREVID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор записи связывания с последующей исторической записью'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'NEXTID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Статус действия над записью – причина появления записи (см. описание таблицы OperationStatus):
01 – Инициация;
10 – Добавление;
20 – Изменение;
21 – Групповое изменение;
30 – Удаление;
31 - Удаление вследствие удаления вышестоящего объекта;
40 – Присоединение адресного объекта (слияние);
41 – Переподчинение вследствие слияния вышестоящего объекта;
42 - Прекращение существования вследствие присоединения к другому адресному объекту;
43 - Создание нового адресного объекта в результате слияния адресных объектов;
50 – Переподчинение;
51 – Переподчинение вследствие переподчинения вышестоящего объекта;
60 – Прекращение существования вследствие дробления;
61 – Создание нового адресного объекта в результате дробления
'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'OPERSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Начало действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'STARTDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Окончание действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'ENDDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Внешний ключ на нормативный документ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'NORMDOC';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Признак действующего адресного объекта'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'LIVESTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Кадастровый номер'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'CADNUM';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Тип адресации:
0 - не определено
1 - муниципальный;
2 - административно-территориальный'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STEAD'
	,@level2type = N'Column'
	,@level2name = N'DIVTYPE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Месторасположение ориентира'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'LOCATION';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Почтовый индекс'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'POSTALCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'IFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'IFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKATO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'OKATO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKTMO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'OKTMO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Дата внесения записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'UPDATEDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Уникальный идентификатор записи ориентира'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'LANDID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Глобальный уникальный идентификатор ориентира'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'LANDGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Уникальный идентификатор родительского объекта (улицы, города, населенного пункта и т.п.)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'AOGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Начало действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'STARTDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Окончание действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'ENDDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Внешний ключ на нормативный документ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_DEL_LANDMARK'
	,@level2type = N'Column'
	,@level2name = N'NORMDOC';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Почтовый индекс'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'POSTALCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код региона'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'REGIONCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'IFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ФЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSFL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'IFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код территориального участка ИФНС ЮЛ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'TERRIFNSUL';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKATO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'OKATO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'OKTMO'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'OKTMO';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Дата время внесения записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'UPDATEDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Номер дома'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'HOUSENUM';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Признак владения'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'ESTSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Номер корпуса'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'BUILDNUM';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Номер строения'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'STRUCNUM';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Признак строения'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'STRSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Уникальный идентификатор записи дома'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'HOUSEID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Глобальный уникальный идентификатор дома'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'HOUSEGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Guid записи родительского объекта (улицы, города, населенного пункта и т.п.)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'AOGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Начало действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'STARTDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Окончание действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'ENDDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Состояние дома'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'STATSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Внешний ключ на нормативный документ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'NORMDOC';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Счетчик записей домов для КЛАДР 4'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'COUNTER';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Кадастровый номер'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'CADNUM';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Тип адресации:
0 - не определено
1 - муниципальный;
2 - административно-территориальный'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_HOUSE'
	,@level2type = N'Column'
	,@level2name = N'DIVTYPE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Глобальный уникальный идентификатор адресного объекта (помещения)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'ROOMGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Номер помещения или офиса'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'FLATNUMBER';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Тип помещения'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'FLATTYPE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Номер комнаты'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'ROOMNUMBER';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Тип комнаты'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'ROOMTYPE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Код региона'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'REGIONCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Почтовый индекс'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'POSTALCODE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Дата внесения записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'UPDATEDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор родительского объекта (дома)'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'HOUSEGUID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Уникальный идентификатор записи. Ключевое поле.'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'ROOMID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор записи связывания с предыдушей исторической записью'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'PREVID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Идентификатор записи связывания с последующей исторической записью'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'NEXTID';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Начало действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'STARTDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Окончание действия записи'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'ENDDATE';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Признак действующего адресного объекта'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'LIVESTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Внешний ключ на нормативный документ'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'NORMDOC';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Статус действия над записью – причина появления записи (см. описание таблицы OperationStatus):
01 – Инициация;
10 – Добавление;
20 – Изменение;
21 – Групповое изменение;
30 – Удаление;
31 - Удаление вследствие удаления вышестоящего объекта;
40 – Присоединение адресного объекта (слияние);
41 – Переподчинение вследствие слияния вышестоящего объекта;
42 - Прекращение существования вследствие присоединения к другому адресному объекту;
43 - Создание нового адресного объекта в результате слияния адресных объектов;
50 – Переподчинение;
51 – Переподчинение вследствие переподчинения вышестоящего объекта;
60 – Прекращение существования вследствие дробления;
61 – Создание нового адресного объекта в результате дробления
'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'OPERSTATUS';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Кадастровый номер помещения'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'CADNUM';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Кадастровый номер комнаты в помещении'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_ROOM'
	,@level2type = N'Column'
	,@level2name = N'ROOMCADNUM';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Наименование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STRSTAT'
	,@level2type = N'Column'
	,@level2name = N'NAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Краткое наименование'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STRSTAT'
	,@level2type = N'Column'
	,@level2name = N'SHORTNAME';

EXEC sp_addextendedproperty @name = 'description'
	,@value = N'Признак строения'
	,@level0type = N'Schema'
	,@level0name = N'dbo'
	,@level1type = N'Table'
	,@level1name = N'_STRSTAT'
	,@level2type = N'Column'
	,@level2name = N'STRSTATID'

5. Modyfikujemy same schemy:

-- Definicja linku do importowanego schematu
update a
Set x.modify ('declare namespace xs="http://www.w3.org/2001/XMLSchema";             
insert   as first
into (xs:schema)[1]')
from dbo.[_FIAS_SCHEMAS] a

-- Definicja atrybutu korzeniowego
update a
Set x.modify('declare namespace ss="urn:schemas-microsoft-com:mapping-schema";             
insert (              
           attribute ss:is-constant {"1"}          
        )             
into (\/xs:schema[1]\/xs:element[1])')
from dbo.[_FIAS_SCHEMAS] a

-- Definicja węzła, który jest wierszem tabeli i powiązaną tabelą
update a
Set x.modify('declare namespace ss="urn:schemas-microsoft-com:mapping-schema";             
insert (              
           attribute ss:relation {sql:column("a.table")}         
        )             
into (xs:schema[1]\/xs:element[1]\/xs:complexType[1]\/xs:sequence[1]\/xs:element[1])')
from dbo.[_FIAS_SCHEMAS] a

-- Adnotacja pól w schemacie
-- Ponieważ można modyfikować tylko jeden węzeł na raz - należy użyć kursora
Declare @table nvarchar(4000)
Declare @column nvarchar(4000)

Declare cur CURSOR LOCAL FORWARD_ONLY
	for
	Select [table "" not found /]
, [column] from dbo.[_FIAS] Open cur FETCH NEXT FROM cur into @table, @column WHILE @@FETCH_STATUS = 0 BEGIN update a Set x.modify('declare namespace ss="urn:schemas-microsoft-com:mapping-schema"; insert ( attribute ss:field {sql:column("t.column")} ,attribute ss:datatype {sql:column("b.sqltype")} ) into (//xs:attribute[@name = sql:column("b.column")])[1]') from dbo.[_FIAS_SCHEMAS] a inner join dbo.[_FIAS] b on a.[table "" not found /]
= b.[table "" not found /]
cross apply (Values(QUOTENAME(b.[column]))) t([column]) Where b.[table "" not found /]
= @table and b.[column] = @column FETCH NEXT FROM cur into @table, @column END CLOSE cur; DEALLOCATE cur;

6. A na koniec wyeksportujemy schemy xsd na dysk do dalszego wykorzystania:

-- Eksport schematów
-- Zwróć uwagę, że ścieżka do eksportowanych schematów jest zakodowana na sztywno!
Set @sql = (
Select N'; exec xp_cmdshell ''bcp "Select [x] from [FIAS2].[dbo].[_FIAS_SCHEMAS] where [table “” not found \/]
= ''''' + a.[table “” not found \/]
+ '''''" queryout "c:filesFIAS' + a.[table “” not found \/]
+ '.xsd" -S . -T -w''' from dbo.[_FIAS_SCHEMAS] a for xml path(N''), type ).value(N'.', N'nvarchar(max)') exec (@sql)

Gotowe! :-)))

Oto całe zapytanie, które generuje tabele, ich opisy, modyfikuje schemy i eksportuje je na dysk:

UŻYJ [FIAS2]
przejdź

jeśli OBJECT_ID('dbo.[_FIAS]') nie jest null 
	drop table dbo.[_FIAS]
przejdź

jeśli OBJECT_ID('dbo._FIAS_SCHEMAS') nie jest null 
	drop table dbo.[_FIAS_SCHEMAS]
przejdź

Zadeklaruj @schema sysname = N'dbo'
Zadeklaruj @sql nvarchar(max)

Utwórz tabelę dbo.[_FIAS_SCHEMAS] (x xml, [table “” not found \/]
sysname) wstaw do dbo.[_FIAS_SCHEMAS] (x, [table “” not found \/]
) WYBIERZ x = CAST(BulkColumn AS XML).query('.'), '_ACTSTAT' [tabela "" nie znaleziona \/]
Z OPENROWSET(BULK 's01sq03c$filesFIASAS_ACTSTAT_2_250_08_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_ADDROBJ' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_ADDROBJ_2_250_01_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_CENTERST' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_CENTERST_2_250_10_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_CURENTST' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_CURENTST_2_250_07_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_DEL_ADDROBJ' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_DEL_ADDROBJ_2_250_15_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_DEL_HOUSEINT' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_DEL_HOUSEINT_2_250_17_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_DEL_HOUSE' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_DEL_HOUSE_2_250_16_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_DEL_LANDMARK' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_DEL_LANDMARK_2_250_18_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_DEL_NORMDOC' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_DEL_NORMDOC_2_250_19_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_ESTSTAT' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_ESTSTAT_2_250_13_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_FLATTYPE' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_FLATTYPE_2_250_23_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_HOUSEINT' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_HOUSEINT_2_250_03_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_HOUSE' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_HOUSE_2_250_02_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_HSTSTAT' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_HSTSTAT_2_250_12_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_INTVSTAT' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_INTVSTAT_2_250_11_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_LANDMARK' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_LANDMARK_2_250_04_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_NDOCTYPE' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_NDOCTYPE_2_250_20_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_NORMDOC' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_NORMDOC_2_250_05_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_OPERSTAT' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_OPERSTAT_2_250_09_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_ROOMTYPE' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_ROOMTYPE_2_250_24_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_ROOM' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_ROOM_2_250_21_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_SOCRBASE' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_SOCRBASE_2_250_06_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_STEAD' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_STEAD_2_250_22_04_01_01.xsd', SINGLE_BLOB) x Union all SELECT x = CAST(BulkColumn AS XML).query('.'), '_STRSTAT' FROM OPENROWSET(BULK 's01sq03c$filesFIASAS_STRSTAT_2_250_14_04_01_01.xsd', SINGLE_BLOB) x ;WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema' as xs) Select a.[table “” not found "]
,tbl.[root_name] ,tbl.[root_description] ,tbl.[name] ,ROW_NUMBER() over (partition by a.[table "" not found "]
zamów według 1/0) ,tbl.[kolumna] ,tbl.[wymagane] ,tbl.[opis] ,tbl.[typ] ,tbl.[dł] ,Przypadek tbl.[typ] gdy N'byte' to N'tinyint' gdy N'date' to N'date' gdy N'int' to N'int' gdy N'string' to Przypadek gdy tbl.[dł] = 36 i (tbl.[kolumna] jak N'%ID' lub tbl.[kolumna] = N'NORMDOC') to N'uniqueidentifier' gdy tbl.[dł] jest Null to N'nvarchar(max)' Inaczej N'nvarchar(' + cast(tbl.[dł] as nvarchar(4000)) + N')' KOŃCOWY gdy N'integer' to Przypadek gdy tbl.[dł] > 9 to N'bigint' gdy tbl.[dł] <= 4 to N'smallint' Inaczej N'int' koniec Inaczej N'nvarchar(max)' Koniec [sqltyp] ,t.n.query('.') [węzeł] do dbo.[_FIAS] z dbo.[_FIAS_SCHEMAS] a Cross apply a.x.nodes('//xs:atrybut') t(n) Cross apply (wartości -- niektóre pola są używane więcej niż raz, więc zróbmy to w ten sposób :) ( x.value('(xs:schema[1]/xs:element[1]/@name)', 'nvarchar(255)') ,x.value('(xs:schema[1]/xs:element[1]/xs:annotation/xs:documentation[1]/text())[1]', 'nvarchar(4000)') ,x.value('(xs:schema[1]/xs:element[1]/xs:complexType[1]/xs:sequence[1]/xs:element[1]/@name)', 'nvarchar(255)') ,t.n.value('(. /@name)[1]', 'nvarchar(255)') ,t.n.value('(. /@use)[1]', 'nvarchar(255)') ,Stuff(Coalesce(t.n.value('(. /xs:simpleType/xs:restriction/@base)[1]', 'nvarchar(255)'), t.n.value('(. /@type)[1]', 'nvarchar(255)')), 1, 3, '') ,Coalesce(t.n.value('(. /xs:simpleType/xs:restriction/xs:length/@value)[1]', 'int') ,t.n.value('(. /xs:simpleType/xs:restriction/xs:maxLength/@value)[1]', 'int') ,t.n.value('(. /xs:simpleType/xs:restriction/xs:totalDigits/@value)[1]', 'int')) ,Replace( Replace( Replace( Replace( Replace( Replace( Replace( Replace( Replace(t.n.value('(. /xs:annotation/xs:documentation)[1]', 'nvarchar(4000)'), ' ', ' ') , ' ', ' ') , ' ', ' ') , ' ', ' ') , ' ', ' ') , ' ', ' ') , ' ', ' ') , ' ', ' ') , ' ', ' ') ) ) tbl([root_name], [root_description], [name], [column], [required], [type], [len], [description]) -- Zobaczymy wyniki Wybierz * z dbo.[_FIAS] -- Stwórz kod do tworzenia tabel i uruchom go set @sql = ( Select Distinct N';Utwórz tabelę ' + Quotename(@schema) + N'.' + Quotename([tabela “” nie znaleziona \/]"
) + N'(' + Stuff((Select N',' + QUOTENAME(b.[column]) + N' ' + b.[sqltype] + Case b.[required] kiedy 'required' wtedy N' NOT NULL' kiedy 'optional' wtedy N' NULL' Koniec Z dbo.[_FIAS] b gdzie b.[table “” not found \/]
= a.[table “” not found \/]
Zamów według N ASC Dla xml ścieżka(N''), typ ).value(N'.', 'nvarchar(max)'), 1, 1, N'') + N')' z dbo.[_FIAS] a Dla xml ścieżka(N''), typ).value(N'.', N'nvarchar(max)') wykonaj (@sql) -- Utworzymy adnotację do tabel i pól Set @sql = ( Wybierz N'; wykonaj sp_addextendedproperty @name=''description'', @value=N''' + a.[root_description] + N''', @level0type =N''Schema'', @level0name = N''' + @schema + N''', @level1type = N''Table'', @level1name = N''' + a.[tabela “” nie znaleziona \/]
+ N'''' from (Select distinct [table “” not found \/]
, [root_description] from dbo.[_FIAS]) a for xml path(N''), type ).value(N'.', N'nvarchar(max)') exec (@sql) Set @sql = ( Select N'; exec sp_addextendedproperty @name=''description'', @value=N''' + a.[description] + N''', @level0type =N''Schema'', @level0name = N''' + @schema + N''', @level1type = N''Table'', @level1name = N''' + a.[table “” not found \/]
+ N''' , @level2type = N''Column'', @level2name = N''' + a.[column] + N'''' from dbo.[_FIAS] a for xml path(N''), type ).value(N'.', N'nvarchar(max)') exec (@sql) -- Definicja odniesienia do importowanej schemy update a Set x.modify ('declare namespace xs="http://www.w3.org/2001/XMLSchema"; insert as first into (xs:schema)[1]') from dbo.[_FIAS_SCHEMAS] a -- Definicja atrybutu korzennego update a Set x.modify('declare namespace ss="urn:schemas-microsoft-com:mapping-schema"; insert ( attribute ss:is-constant {"1"} ) into ( /xs:schema[1]/xs:element[1])') from dbo.[_FIAS_SCHEMAS] a -- Definicja węzła, który jest wierszem tabeli i z nią powiązanej tabeli update a Set x.modify('declare namespace ss="urn:schemas-microsoft-com:mapping-schema"; insert ( attribute ss:relation {sql:column("a.table")} ) into (xs:schema[1]/xs:element[1]/xs:complexType[1]/xs:sequence[1]/xs:element[1])') from dbo.[_FIAS_SCHEMAS] a -- Adnotacja pól w schemie -- Ponieważ w jednym kroku można zmodyfikować tylko jeden węzeł - trzeba użyć kursora Declare @table nvarchar(4000) Declare @column nvarchar(4000) Declare cur CURSOR LOCAL FORWARD_ONLY for Select [table “” not found \/]
, [column] from dbo.[_FIAS] Open cur FETCH NEXT FROM cur into @table, @column WHILE @@FETCH_STATUS = 0 BEGIN update a Set x.modify('declare namespace ss="urn:schemas-microsoft-com:mapping-schema"; insert ( attribute ss:field {sql:column("t.column")} ,attribute ss:datatype {sql:column("b.sqltype")} ) into (//xs:attribute[@name = sql:column("b.column")])[1]') from dbo.[_FIAS_SCHEMAS] a inner join dbo.[_FIAS] b on a.[table "" not found /]
= b.[table "" not found /]
cross apply (Values(QUOTENAME(b.[column]))) t([column]) Where b.[table "" not found /]
= @table and b.[column] = @column FETCH NEXT FROM cur into @table, @column END CLOSE cur; DEALLOCATE cur; -- Eksport schem -- Zauważ, że ścieżka do eksportowanych schem jest zakodowana na sztywno! Set @sql = ( Select N'; exec xp_cmdshell ''bcp "Select [x] from [FIAS2].[dbo].[_FIAS_SCHEMAS] where [table “” not found \/]
= ''''' + a.[table “” not found \/]
+ '''''" queryout "c:filesFIAS' + a.[table “” not found \/]
+ '.xsd" -S . -T -w''' from dbo.[_FIAS_SCHEMAS] a for xml path(N''), type ).value(N'.', N'nvarchar(max)') exec (@sql)

Teraz pozostaje tylko wywołać procedurę ładowania dla każdego pliku xml z odpowiednią schemą (samo rozpakowane pliki znajdują się w folderze e:tmp, a schemy – wyeksportowaliśmy do c:filesFIAS):

UŻYJ FIAS2
IDŹ

Deklaruj @sql nvarchar(max)

jeśli OBJECT_ID('tempdb..#t') jest nie null
	drop table #t

Utwórz tabelę #t ([output] sysname NULL)

wstaw do #t
exec xp_cmdshell 'dir e:tmp \/B'

;Z danymi ładowania jako
(
Wybierz 
'_' + t.x.value('(a[2])', 'nvarchar(255)') [table “” not found \/]
,t.x.value('(a[3])', 'date') [fias_date] ,t.x.value('(a[4])', 'uniqueidentifier') [fias_guid] ,a.[output] [file_name] z #t a cross apply (VALUES(Cast('<a>' + Replace(Replace(Replace(Replace(a.[output],'DEL_', 'DEL$'), '_', '<\/a><a>'), '.', '<\/a><a>'), '$', '_') + '<\/a>' as xml))) t(x) Gdzie [output] jak 'AS[_]%.xml' ) Wybierz @sql = (Wybierz N';exec [dbo].[spXMLBulkLoad] ''e:tmp' + a.[file_name] + ''', ''c:filesFIAS' + b.[table “” not found \/]
+ '.xsd'', ''FIAS2'', ''e:tmperr.xml''' z danych ładowania a wewnętrzne połączenie [dbo].[_FIAS_SCHEMAS] b na a.[table “” not found \/]
= b.[table "" not found /]
Dla xml ścieżka(''), typ).value(N'.', N'nvarchar(max)') Wykonaj (@sql)

Uff…

No cóż, teraz naprawdę wszystko.

Jednakże, oto co chcę wam powiedzieć, szanowni koledzy!
To wszystko działa po prostu niezwykle wolno!
Nie mówię oczywiście o tworzeniu tabel i schem, ale o ładowaniu.

W środowisku testowym ładowanie trwało bez mała 5 godzin (sic!!!). I to jeszcze bez indeksowania tabel.

Jednocześnie ładowanie systemu wejścia-wyjścia było na poziomie 3 MB/s, a użyte były tylko dwa rdzenie.

Ładowanie obiektów adresowych odbywało się z prędkością nie przekraczającą 3 tysiące rekordów na sekundę, ładowanie budynków – z prędkością nie większą niż 8 tysięcy na sekundę. A ich, na marginesie, jest 60 milionów.
Z czym to jest związane – nie mogę powiedzieć, trzeba jeszcze podłubać w kodzie i, najwyraźniej, w ustawieniach VM.

Zauważcie, że ładowanie odbywa się w partiach. A później zakłada się utworzenie indeksów klastrowych dla ich AOID.

Ponieważ przedstawiają one GUID-y, lepiej zrobić to właśnie w ten sposób, ponieważ jeśli stworzyć indeksy klastrowe PRZED ładowaniem – na wyjściu otrzymamy tabelę, fragmentowaną gdzieś na 50%, nie mniej. No i indeksy lepiej też tworzyć po ładowaniu, ponieważ wstawianie do indeksów zwalnia ładowanie jeszcze bardziej.

Dlatego też nazwy tabel zaczynają się u mnie od podkreślenia (_). Zakładałem, że najpierw załaduję dane do nich, potem odtworzę indeksy docelowych tabel, a następnie spokojnie dokonam Alter table switch.

Zwróćcie też uwagę na niezbyt optymalne typy danych dla pól tabel FIAS.
Na przykład, użycie int tam, gdzie wystarczy tinyint, czy nvarchar w polach, gdzie przewiduje się przechowywanie jedynie wartości numerycznych, typowo kodu regionu lub OKATO.
Tak w schematach :-(

Jednak nic nie stoi na przeszkodzie, aby po utworzeniu tabeli metadanych, [dbo].[_FIAS], pochylić się nad nią i przeprowadzić tuning, a następnie stworzyć nowe schematy ładowania na podstawie skorygowanych metadanych.

Jeśli jednak nie uda się wyeliminować wolnego ładowania, najprawdopodobniej będziemy musieli wrócić do wersji z ładowaniem z dbf i nareszcie rozwiązać problemy w małych dbf. I napisać jeszcze jeden artykuł.

dbf załadował się normalnie w 8 wątkach w ciągu 1 godziny z haczykiem, a około godzinę zajęło scalanie poszczególnych tabel w docelowe oraz budowanie indeksów na nich.

… Cóż, w końcu wyciągnąć ręce z… eh… afedronu i zrobić normalną aplikację tiers danych, ładować dane jak wszyscy normalni ludzie, przez SSIS.

Ale to już zupełnie inna historia.

Skrypty i schematy xsd

Linki związane z tematem:

→ FIAS

Obrazek z pieskiem - nie mój 🙂

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster