代码之家  ›  专栏  ›  技术社区  ›  Ibrahim D.

MySQL到SQL Server SP或实体框架

  •  1
  • Ibrahim D.  · 技术社区  · 8 年前

    我很难将这个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
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Brien Foss    8 年前

    对于错误:

    无法识别Trim内置函数名

    TRIM() 仅从SQL Server 2017开始提供。

    如果未使用该版本,请使用 LTRIM(RTRIM(@ip))


    对于错误:

    并且在@loc\u id上得到一个错误,表示它期望(

    而不是 IFNULL() ,我想你要找的是 ISNULL()


    对于错误:

    在函数中使用副作用运算符SELECT无效

    而不是:

    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
            )