C# MySQL到SQL Server SP或实体框架
我很难将这个MySQL函数转换成SQl Server,甚至转换成实体框架的C代码 我将使用GEO-Lite数据库的这段代码,这样我就可以获得IP地址上的位置信息C# MySQL到SQL Server SP或实体框架,c#,mysql,sql-server,C#,Mysql,Sql Server,我很难将这个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
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\u ATON
但我得到了一些错误,比如Trim没有被识别出内置函数名,这很奇怪,因为它是
并且在@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
对于错误:
无法识别Trim内置函数名
仅从SQL Server 2017开始提供
如果您不使用该版本,请使用LTRIMRTRIM@ip.
对于错误:
并且在@loc_id上得到一个错误,表示它正在等待
我想你要找的不是IFNULL,而是
对于错误:
在函数中使用副作用运算符SELECT无效
而不是:
SET @loc_id = (
SELECT geoname_id
FROM ip_blocks
WHERE ip_to >= dbo.ipStringToInt(TRIM(@ip))
ORDER BY ip_to LIMIT 1
)
或:
改用:
SET @loc_id = (
SELECT TOP 1 geoname_id
FROM ip_blocks
WHERE ip_to >= dbo.ipStringToInt(LTRIM(RTRIM(@ip)))
ORDER BY ip_to
)
谢谢,伙计,我仍然在函数中使用了一个副作用的运算符SELECT,但其他错误正在解决此函数中的错误:IP2Location?我更新了我的问题,以显示在您修复后的最新版本,我在整个SELECT行中都遇到了错误:我正准备建议将LIMIT的使用替换为TOP 1,但你明白了。好的,看看你的编辑这是你对SELECT INTO@loc\u id的用法。你第一次做对了,只需使用SELECT TOP 1 geoname\u id FROM。。。。像最初一样使用SET
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
)