转换nvarchar值' 2.17E + 16'到数据类型int和nvarchar值的转换' 21700000001382594'溢出了一个int列

时间:2018-01-11 12:06:18

标签: sql tsql

我在删除数据时遇到问题 我使用TSQL创建了以下内容:

function get_main_domain($host='') {
    if(empty($host))$host=$_SERVER['HTTP_HOST'];
    $domain_parts = explode('.',$host);
    $count=count($domain_parts);
    if($count<=2)return $host;

    $permit=0;
    for($i=$count-1;$i>=0;$i--){
        $permit++;
        if(strlen($domain_parts[$i])>3)break;
    }

    while(count($domain_parts) >$permit)array_shift($domain_parts);
    return join('.', $domain_parts);
}

我将数据插入表中。当我尝试使用以下TSQL删除数据时:

CREATE TABLE [dbo].[google] (
[ad] [varchar](255) NULL,
[ad_id] [varchar](30) NULL ) ON [PRIMARY]
GO

CREATE TABLE [dbo].[gmap] (
[ad] [nvarchar](200) NULL,
[ad_id] [nvarchar](200) NULL) ON [PRIMARY]
GO

create view [dbo].[v_google] as 
select a.[ad], a.[ad_id]
from [dbo].[google] a
left join [dbo].[gmap] b on a.[ad_id] = b.[ad_id]
GO

我收到错误消息:

delete b 
from [dbo].[v_google] a
join [dbo].[google] b on a.[ad] = b.[ad]
where a.ad is null

我已经查看了有关错误消息的解决方案,但使用的TSQL对我来说太先进了,并且不了解它,因为我是SQL SERVER中的新学员。

1 个答案:

答案 0 :(得分:0)

您可能在联接的ON子句的其中一个成员中隐式强制转换为INT。我会尝试通过将两个成员转换为NVARCHAR来更改ON子句。像这样(我假设NVARCHAR(255)足够长,你可以尝试BIGINT它你只有大数字,它会使查询运行得更快):

join [dbo].[google] b on CAST (a.[ad] AS NVARCHAR(255)) = CAST (b.[ad] AS NVARCHAR(255))

如果数据集中只有整数,则SQL Server会将隐式强制转换为INT。然后,当SQL Server比较JOIN中的两列时,它会尝试以相同的类型(在这种情况下为INT)转换ON的两侧。这就是为什么即使你没有明确地尝试转换为INT也会转换为INT错误。