【发布时间】:2018-03-17 03:44:15
【问题描述】:
我无法将此 MySQL 函数转换为 SQl 服务器,甚至转换为实体框架的 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
【问题讨论】:
标签: c# mysql sql-server