gpt4 book ai didi

NULL 和 VARCHAR 之间的 SQL 并集错误

转载 作者:行者123 更新时间:2023-12-02 06:00:04 24 4
gpt4 key购买 nike

我有两个具有相同列的 View 。第一个 View 中的一列是“动态”生成的,并设置为 NULL,而另一个 View 中的同一列的值存储为 varchar。我有一个如下所示的存储过程:

ALTER PROCEDURE [dbo].[mi_GetLearners]  
(@centrename nvarchar(200))
AS

SELECT [centrename]
,[Name]
,[Username] --generated on the fly as NULL
FROM [DB1].[dbo].[vw_Learners]
WHERE [centrename] = @centrename

UNION

SELECT [centrename]
,[Name]
,[Username] --values stored as varchar
FROM [Linked_Server].[DB2].[dbo].[vw_Learners]
WHERE [centrename] = @centrename

DB1 在 SQL Server 2008 R2 上
DB2 位于 SQL Server 2005 上

当我运行存储过程时,出现以下错误:

Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the varchar value 'someusername' to data type int.

为什么它试图将值转换为 int 数据类型,而另一列设置为 NULL?如果我将第二列从 NULL 更改为 ' ' 存储过程工作正常...我真的很困惑为什么 varchar 之间存在并集在 select 语句中生成的 列和 NULL 列会抛出这样的错误...有什么想法吗?

编辑:我正在寻找解释而不是解决方案......

编辑2:运行以下代码:

CREATE VIEW vw_myview
AS
SELECT NULL AS MyColumn

EXECUTE sp_help vw_myview

返回:

    Type    Column_name
int MyColumn

最佳答案

问题在于NULL(在某些回旋余地内)是每个数据类型的成员。

运行任何 SELECT 查询时,每列的内容必须属于一种类型,并且只能是一种类型。当列中存在混合值(包括 NULL)时,显然可以通过检查非 NULL 值的类型和适当的转换来确定类型根据需要执行。

但是,当特定列的所有行都包含 NULLNULL 尚未转换为特定类型时,则没有可使用的类型信息。因此,SQL Server 有点武断地决定该列的类型为 int

create view V1
as
select 'abc' as Col1,null as Col2
go
create view V2
as
select 'abc' as Col1,CAST(null as varchar(100)) as Col2

V1 具有 varchar(3)int 类型的列。

V2 具有 varchar(3)varchar(100) 类型的列。

关于NULL 和 VARCHAR 之间的 SQL 并集错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11431651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com