我很难将这个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