在 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);

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

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

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

对于相关字段,临时表的数据类型NVARCHAR(MAX),但日期字段的日期时间除外

尝试使用CONVERT方法,但我不确定我们如何将其与图片中的DISTINCT一起使用

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

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

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

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

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

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

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

我确实建议你改变列CreatedBy的数据类型,我假设UpdatedBy,从nvarchar(MAX)到类似nvarchar(256)的东西;你不需要2GB的字符(大约10亿(来存储这些信息。

相关内容

最新更新