首页 > 解决方案 > 在 db.table 中插入不同的条目会导致 SQL Server 中的隐式转换错误

问题描述

我有一个要求,我需要将在记录中找到的新条目插入到其主表中,并将标识符的 ID 映射到主表

例如考虑下面的例子,

-- Insert into Category Master if not exists  
INSERT INTO tblCategoryMaster (Category,
                               CreatedBy,
                               CreatedDate,
                               UpdatedBy,
                               UpdatedDate)
SELECT DISTINCT
       (category),
       SERVERPROPERTY('MACHINENAME'),
       GETDATE(),
       SERVERPROPERTY('MACHINENAME'),
       GETDATE()
FROM tblTempDataStaging stg
WHERE category IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM tblCategoryMaster ctg WHERE ctg.Category = stg.category);

执行 select 查询后,我们得到不同条目的列表,每次在临时表中输入新条目时,条目都会相应地填充到主表中。

服务器不允许我插入,它给我一个错误说

消息 257,级别 16,状态 3,第 39 行
不允许从数据类型 sql_variant 到 nvarchar(max) 的隐式转换。使用 CONVERT 函数运行此查询。

暂存表的数据类型NVARCHAR(MAX)适用于相关字段,但日期字段的日期时间除外

尝试使用CONVERT方法,但我不确定我们如何DISTINCT在图片中使用它

你能建议我如何解决这个问题吗?

标签: sql-server

解决方案


错误告诉你问题:SERVERPROPERTY('MACHINENAME')返回数据类型sql_variant

SELECT system_type_name
FROM sys.dm_exec_describe_first_result_set(N'SELECT SERVERPROPERTY(''MACHINENAME'') AS MachineName',NULL,NULL);

底层数据类型是 a nvarchar(认为它肯定不会是机器名称的 2GB 存储空间!),如下所示:

SELECT SQL_VARIANT_PROPERTY(SERVERPROPERTY('MACHINENAME'),'Basetype')

您需要显式转换该值。例如:

CONVERT(nvarchar(256),SERVERPROPERTY('MACHINENAME'))

我确实建议您更改列的数据类型CreatedBy,我假设UpdatedBy,从nvarchar(MAX)类似于nvarchar(256); 您不需要 2GB 的字符(大约 10 亿个)来存储该信息。


推荐阅读