MySQL для SQL Server SP или Entity Framework

У меня возникли проблемы с преобразованием этой функции MySQL в SQl Server или даже в код C# для структуры сущностей.

Я буду использовать этот код с базой данных GEO Lite, чтобы получить информацию о местоположении по IP-адресу.

BEGIN
    DECLARE loc_id INT;

    SELECT geoname_id
    INTO loc_id
    FROM ip_blocks
    WHERE ip_to >= INET_ATON(TRIM(ip))
    ORDER BY ip_to LIMIT 1;

    RETURN IFNULL(loc_id, 0);
END

Я попытался создать эту функцию SQL Server, чтобы заменить функцию mysql INET_ATON

CREATE FUNCTION dbo.ipStringToInt (@ip CHAR(15))
RETURNS INT
AS
BEGIN
    DECLARE @rv INT
        ,@o1 INT
        ,@o2 INT
        ,@o3 INT
        ,@o4 INT
        ,@base INT

    SELECT @o1 = CONVERT(INT, PARSENAME(@ip, 4))
        ,@o2 = CONVERT(INT, PARSENAME(@ip, 3))
        ,@o3 = CONVERT(INT, PARSENAME(@ip, 2))
        ,@o4 = CONVERT(INT, PARSENAME(@ip, 1))

    IF (
            @o1 BETWEEN 0
                AND 255
            )
        AND (
            @o2 BETWEEN 0
                AND 255
            )
        AND (
            @o3 BETWEEN 0
                AND 255
            )
        AND (
            @o4 BETWEEN 0
                AND 255
            )
    BEGIN
        SELECT @base = CASE 
                WHEN @o1 < 128
                    THEN (@o1 * 16777216)
                ELSE - (256 - @o1) * 16777216
                END

        SET @rv = @base + (@o2 * 65536) + (@o3 * 256) + (@o4)
    END
    ELSE
        SET @rv = - 1

    RETURN @rv
END
GO

А также преобразовать функцию MySQL в эту версию SQL Server:

CREATE FUNCTION IP2Location (@ip VARCHAR(50))
RETURNS INT
AS
BEGIN
    DECLARE @loc_id INT

    SET @loc_id = (
            SELECT geoname_id
            FROM ip_blocks
            WHERE ip_to >= dbo.ipStringToInt(TRIM(@ip))
            ORDER BY ip_to LIMIT 1
            )

    RETURN IFNULL(@loc_id, 0);
END
GO

Но я получаю такие ошибки, как Trim is not recognized built-in function name, что странно, потому что это так.

И на @loc_id появляется сообщение об ошибке, в котором говорится, что ожидается (.

Был бы признателен за помощь

Спасибо

РЕДАКТИРОВАТЬ №1: Моя функция теперь выглядит так:

CREATE FUNCTION IP2Location (@ip varchar(50)) RETURNS INTEGER
AS
BEGIN
DECLARE @loc_id INTEGER 

SELECT top 1 geoname_id INTO @loc_id FROM ip_blocks WHERE ip_to >= dbo.ipStringToInt(LTRIM(RTRIM(@ip))) ORDER BY ip_to

RETURN isnull(@loc_id, 0);
END
go
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В случае ошибки:

Trim is not recognized built-in function name

TRIM() доступен только начиная с SQL Server 2017.

Если вы не используете эту версию, используйте LTRIM(RTRIM(@ip)).


В случае ошибки:

And getting an error on @loc_id which says it is expecting (

Вместо IFNULL() я думаю, что вы ищете ISNULL()


В случае ошибки:

Invalid use of a side-effecting operator SELECT within a function

Вместо:

SET @loc_id = (
        SELECT geoname_id
        FROM ip_blocks
        WHERE ip_to >= dbo.ipStringToInt(TRIM(@ip))
        ORDER BY ip_to LIMIT 1
        )

Или же:

SELECT TOP 1 geoname_id
INTO @loc_id
FROM ip_blocks
WHERE ip_to >= dbo.ipStringToInt(LTRIM(RTRIM(@ip)))
ORDER BY ip_to

Вместо этого используйте:

SET @loc_id = (
        SELECT TOP 1 geoname_id
        FROM ip_blocks
        WHERE ip_to >= dbo.ipStringToInt(LTRIM(RTRIM(@ip)))
        ORDER BY ip_to
        )

Спасибо, чувак, у меня все еще есть Invalid use of a side-effecting operator SELECT within a function, но другие ошибки исчезли

Ibrahim D. 17.03.2018 05:00

Ошибка в этой функции: IP2Location?

Brien Foss 17.03.2018 05:01

Я обновил свой вопрос, чтобы показать последнюю версию, которая у меня есть после ваших исправлений, я получаю ошибку во всей строке SELECT

Ibrahim D. 17.03.2018 05:03

:) Я как раз собирался порекомендовать заменить использование LIMIT на TOP 1, но вы поняли. Хорошо, глядя на ваше редактирование

Brien Foss 17.03.2018 05:04

Это ваше использование SELECT INTO @loc_id. У вас все было правильно с первого раза, просто используйте SELECT TOP 1 geoname_id FROM.... Используйте SET, как вы это делали изначально

Brien Foss 17.03.2018 05:05

хахаха, это мой первый вопрос по SQL, поэтому я не знаю, кто такой Гордон, но вы бы его задницу надрали :)

Ibrahim D. 17.03.2018 05:13

Блин 650к, чувак конечно активный

Ibrahim D. 17.03.2018 05:16

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