Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL ISNULL()保留字的行为不正确';初级';(SQL Server 2014)_Sql Server_Sql Server 2014_Isnull - Fatal编程技术网

Sql server T-SQL ISNULL()保留字的行为不正确';初级';(SQL Server 2014)

Sql server T-SQL ISNULL()保留字的行为不正确';初级';(SQL Server 2014),sql-server,sql-server-2014,isnull,Sql Server,Sql Server 2014,Isnull,前几天我遇到了这个问题,它不是一个主要问题,因为我可以解决它,但我想知道是否有人可以提供任何见解,或者我是否发现了一个模糊的错误 我们有一个旧的数据库表,它有一个名为Primary的列,这显然是一个保留字。在运行T-SQL查询时,我遇到了一些奇怪的结果,这似乎表明ISNULL函数将列名视为保留字。只是因为周五晚了,我错过了一些很明显的事情,还是这里发生了一些奇怪的事情 下面是一些简单的SQL语句,可以设置几个测试表来演示它 CREATE TABLE [dbo].[Customer] (

前几天我遇到了这个问题,它不是一个主要问题,因为我可以解决它,但我想知道是否有人可以提供任何见解,或者我是否发现了一个模糊的错误

我们有一个旧的数据库表,它有一个名为Primary的列,这显然是一个保留字。在运行T-SQL查询时,我遇到了一些奇怪的结果,这似乎表明ISNULL函数将列名视为保留字。只是因为周五晚了,我错过了一些很明显的事情,还是这里发生了一些奇怪的事情

下面是一些简单的SQL语句,可以设置几个测试表来演示它

CREATE TABLE [dbo].[Customer]
(
    [CustomerID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](50) NOT NULL,

    CONSTRAINT [PK_Customer] 
        PRIMARY KEY CLUSTERED ([CustomerID] ASC)
) ON [PRIMARY]

CREATE TABLE [dbo].[OrderTaken]
(
    [OrderID] [int] IDENTITY(1,1) NOT NULL,
    [Description] [varchar](50) NOT NULL,
    [CustomerID] [int] NOT NULL,
    [Primary] [bit] NOT NULL,

    CONSTRAINT [PK_Order] 
        PRIMARY KEY CLUSTERED ([OrderID] ASC)
) ON [PRIMARY]

ALTER TABLE [dbo].[OrderTaken] WITH CHECK 
   ADD CONSTRAINT [FK_Order_Customer] 
   FOREIGN KEY([CustomerID]) REFERENCES [dbo].[Customer] ([CustomerID])
GO

ALTER TABLE [dbo].[OrderTaken] CHECK CONSTRAINT [FK_Order_Customer]
GO

INSERT INTO [dbo].[Customer](Name) VALUES('Bob')
INSERT INTO [dbo].[Customer](Name) VALUES('Dave')
INSERT INTO [dbo].[Customer](Name) VALUES('Fred')
INSERT INTO [dbo].[Customer](Name) VALUES('Paul')
GO

INSERT INTO [dbo].[OrderTaken](Description, CustomerID, [Primary]) 
VALUES ('Order1', 1, 1)
INSERT INTO [dbo].[OrderTaken](Description, CustomerID, [Primary]) 
VALUES('Order2', 2, 1)
INSERT INTO [dbo].[OrderTaken](Description, CustomerID, [Primary]) 
VALUES('Order3', 2, 1)
INSERT INTO [dbo].[OrderTaken](Description, CustomerID, [Primary]) 
VALUES('Order4', 3, 0)
INSERT INTO [dbo].[OrderTaken](Description, CustomerID, [Primary]) 
VALUES('Order5', 3, 0)
Go
这是一个问题

SELECT 
    C.CustomerID, C.Name,
    O.OrderID, ISNULL(O.[OrderID], -1),
    O.[Primary], ISNULL(O.[Primary], -1) as Weird
FROM 
    Customer C
LEFT JOIN 
    OrderTaken O ON C.CustomerID  = O.CustomerID

请注意,对于没有订单的客户行,O.Primary为NULL,但ISNULL(O.[Primary],-1)返回1而不是-1

问题不在于字段名,而在于字段类型-
位。
它不能保存
-1
值,只能保存
0
1
。当SQL Server尝试将值更改为
-1
时,它会检查
-10
并设置
1
true
)。看

因此,请在检查之前转换字段:

SELECT 
    C.CustomerID,
    C.Name,
    O.OrderID,
    ISNULL(O.[OrderID],-1),
    O.[Primary],
    ISNULL(CONVERT(int,O.[Primary]),-1) as Weird
FROM Customer C
LEFT JOIN OrderTaken O
ON C.CustomerID  = O.CustomerID

或者将列类型更改为
int
tinyint

Doh!所以是星期五晚了,我应该在星期一看。为让我改邪归正而干杯{:O)