View difference between Paste ID: 8YJjpRmg and K0hEZr6B
SHOW: | | - or go back to the newest paste.
1
CREATE TABLE Renewable_Energy_Devices (
2
    device_id NVARCHAR(26) PRIMARY KEY,
3
    device_status INT CHECK (device_status >= 0 AND device_status <= 6),
4
    device_power DECIMAL(18,0),
5
    company_id INT,
6
    device_location GEOGRAPHY,
7
    device_location_geom GEOMETRY,
8
    device_hierarchy HIERARCHYID,
9
    device_description XML
10
);
11
 
12
DECLARE @latitude DECIMAL(9, 6), @longitude DECIMAL(9, 6);
13
DECLARE @point GEOMETRY;
14
DECLARE @device_hierarchy HIERARCHYID;
15
DECLARE @device_description XML;
16
 
17
DECLARE @i INT = 1;
18
WHILE @i <= 50
19
BEGIN
20
    SET @latitude = RAND() * 180 - 90;
21
    SET @longitude = RAND() * 360 - 180;
22
    SET @point = GEOMETRY::Point(@latitude, @longitude, 4326);
23
 
24
    -- Tworzenie hierarchii z użyciem losowej wartości dodanej do korzenia
25
    IF @i = 1
26
        SET @device_hierarchy = HIERARCHYID::GetRoot().GetDescendant(NULL, NULL);
27
    ELSE
28
        SET @device_hierarchy = @device_hierarchy.GetDescendant(NULL, NULL);
29
 
30
    SET @device_description = '<description>Device_' + CAST(@i AS NVARCHAR(5)) + '</description>';
31
 
32
    INSERT INTO Renewable_Energy_Devices (device_id, device_status, device_power, company_id, device_location, device_location_geom, device_hierarchy, device_description)
33
    VALUES (
34
        'Device_' + CAST(@i AS NVARCHAR(5)),
35
        CAST(RAND() * 6 AS INT),
36
        CAST(RAND() * 1000 AS DECIMAL(18, 0)),
37
        CAST(RAND() * 10 AS INT) + 1,
38
        GEOGRAPHY::Point(@latitude, @longitude, 4326),
39
        @point,
40
        @device_hierarchy,
41
        @device_description
42
    );
43
 
44
    SET @i = @i + 1;
45
END;
46
47
Zapytanie wybierze wszystkie urządzenia z tabeli Renewable_Energy_Devices, których geometria umiejscowienia (kolumna device_location_geom) znajduje się w odległości mniejszej niż 1000 jednostek od punktu o współrzędnych (0, 0).
48-
Przykładowe zapytanie wykorzystujące typ danych "geography" znajduje urządzenia znajdujące się w odległości mniejszej niż 100 kilometrów od określonej lokalizacji (w tym przypadku Warszawy). @search_location jest używana do określenia lokalizacji, a funkcja STDistance oblicza odległość między każdą lokalizacją urządzenia a @search_location.
48+
49
-- Wybierz wszystkie urządzenia, których geometria umiejscowienia jest w odległości mniejszej niż 1000 jednostek od punktu o współrzędnych (0, 0)
50
SELECT *
51-
-- Znajdź urządzenia znajdujące się w odległości mniejszej niż 100 kilometrów od określonej lokalizacji
51+
FROM Renewable_Energy_Devices
52-
DECLARE @search_location GEOGRAPHY;
52+
WHERE device_location_geom.STDistance(geometry::Point(0, 0, 4326)) < 1000;
53-
SET @search_location = GEOGRAPHY::Point(52.2297, 21.0122, 4326); -- Przykładowa lokalizacja (Warszawa)
53+