我在删除数据时遇到问题 我使用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中的新学员。
答案 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错误。