Когда x и y вставлены, заполните GEOMETRY автоматически

Идея в том, что когда Longitude и Latitude вставлены, Location должен заполниться правильной информацией. Но когда я пытаюсь написать код этого, я получаю сообщение об ошибке Column names in each table must be unique. Column name '[Location]' in table 'Points' is specified more than once.

Вот блок кода.

ALTER TABLE Points
ADD [Location] AS (CONVERT(GEOMETRY, CASE WHEN Longitude<> 0
                                    AND Latitude<> 0
                               THEN GEOMETRY::STGeomFromText('POINT('
                                                          + CONVERT(VARCHAR, Longitude)
                                                          + ' '
                                                          + CONVERT(VARCHAR, Latitude)
                                                          + ')', 4238)
                               ELSE NULL
                          END))

Итак, это стол Points

CREATE TABLE Points(
Id int PRIMARY KEY IDENTITY(1,1),
Route_Id int FOREIGN KEY REFERENCES [Routes](Id) ON DELETE CASCADE NOT NULL,
Title nvarchar(30) NOT NULL,
[Description] nvarchar NOT NULL ,
Latitude FLOAT NOT NULL,
Longitude FLOAT NOT NULL,
[Location] geometry ,
Point_Image IMAGE 
)

Ошибка означает, что у вас уже есть столбец в таблице с именем Location. Опубликуйте свое заявление CREATE TABLE, если вам нужна помощь в устранении ошибки.

Dan Guzman 07.04.2019 19:58

У вас есть один столбец с именем [Location] (до Point_Image), и вы пытаетесь добавить другой столбец с таким же именем. Вы хотите обновить данные в существующем столбце или изменить этот столбец, чтобы он стал вычисляемым столбцом?

Razvan Socol 07.04.2019 20:05

@RazvanSocol я хочу обновить Location автоматически

user11316976 07.04.2019 20:08

Пара вещей: 1. Я бы посмотрел на статический метод Point() как на менее подробный способ определения вашей точки (docs.microsoft.com/en-us/sql/t-sql/spatial-geometry/…) 2. Всякий раз, когда я вижу, что кто-то использует geometry для чего-то, что представляет местоположения на Земле, я немного нервничаю. зуд (поскольку он не принимает во внимание такие вещи, как кривизна Земли, пересечение нулевого меридиана и другие странные вещи, связанные с вычислениями на сжатом сфероиде).

Ben Thul 07.04.2019 21:44
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
4
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы хотите вставить Longitude и Latitude в столбец Location? если да, то написанный синтаксис неверен.

вы можете попробовать это, не уверен, что это решит вашу проблему.

Insert into Points ([Location])values 
(select (CONVERT(GEOMETRY, CASE WHEN Longitude<> 0
                                    AND Latitude<> 0
                               THEN  
                                                          + CONVERT(VARCHAR, Longitude)
                                                          + ' '
                                                          + CONVERT(VARCHAR, Latitude)

                               ELSE NULL
                          END))
from Points)

да. Я хотел получить, когда Longitude и Latitude вставлены в таблицу Location должны быть заполнены правильными данными. Как я могу написать это?

user11316976 07.04.2019 20:06

Ваш код пытается вставить новые строки в таблицу Points, но терпит неудачу, потому что вы добавили дополнительное предложение values и не указали значения для других столбцов, не допускающих значение NULL.

Razvan Socol 07.04.2019 20:18

Уфф, ладно. Спасибо!

ch2019 07.04.2019 20:23
Ответ принят как подходящий

Если вы просто хотите обновить значения в существующем столбце [Location], вы можете использовать:

UPDATE  dbo.Points
SET     Location = CONVERT(GEOMETRY, 
    CASE WHEN Longitude <> 0 AND Latitude <> 0 
        THEN geometry::STGeomFromText(
            'POINT(' + CONVERT(VARCHAR, Longitude) + ' ' + CONVERT(VARCHAR, Latitude) + ')'
            , 4238)
        ELSE NULL
    END)

Если вы хотите иметь вычисляемый столбец, который всегда будет возвращать вычисляемые данные, вам следует удалить существующий столбец и создать еще один:

ALTER TABLE dbo.Points DROP COLUMN Location
GO
ALTER TABLE Points ADD [Location] AS CONVERT(GEOMETRY, 
    CASE WHEN Longitude <> 0 AND Latitude <> 0 
        THEN geometry::STGeomFromText(
            'POINT(' + CONVERT(VARCHAR, Longitude) + ' ' + CONVERT(VARCHAR, Latitude) + ')'
            , 4238)
        ELSE NULL
    END)

Другие вопросы по теме