向db.table中插入不同的条目会导致SQL Server中的隐式转换错误

问题描述 投票:0回答:1

我有一个需要在记录中找到的新条目插入其主表并将标识符的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);

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

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

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

登台表的数据类型对于相关字段为NVARCHAR(MAX),但日期字段的datetime除外

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

你们能建议我如何解决此问题吗?

sql-server
1个回答
0
投票
错误告诉您问题所在: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亿个字符)来存储该信息。
© www.soinside.com 2019 - 2024. All rights reserved.