我是 SQL Server 的新手,我正在尝试运行以下查询,但收到以下错误
Msg 512,级别 16,状态 1,第 20
行 子查询返回了 1 个以上的值。当子查询跟在 =、!=、<、<= 、>、>= 后面或子查询用作表达式时,不允许这样做。Msg 515,级别 16,状态 2,第 35
行 无法将值 NULL 插入到"用户UID"列、表 'PS_Billing.dbo.Users_Product' 中;列不允许空值。插入失败。
这是我的查询:
DECLARE @UserID varchar(18), @UserUID bigint, @ItemID int,
@ItemCount tinyint, @OrderNumber int, @BuyDate datetime,
@ProductCode varchar(20), @Slot tinyint, @empty smallint
-- Send Item to User Bank
-- ----------- CONFIG ------------------
-- UserID:
SET @UserID = 'Reset'
-- ItemID:
SET @ItemID = 100047
-- Item Count:
SET @ItemCount = 8
-- Produkt Description (max. 20 char.)
SET @ProductCode = ' '
-- --------------------------------------
SET @OrderNumber = 1
SET @BuyDate = GETDATE()
SET @UserUID = (SELECT UserUID
FROM PS_UserData.dbo.Users_Master
WHERE UserID <> @UserID)
SET @Slot = 0
SET @empty = -1
WHILE (@Slot <= 239)
BEGIN
SET @empty = (SELECT COUNT(Slot)
FROM PS_Billing.dbo.Users_Product
WHERE UserUID = @UserUID AND Slot = @Slot)
IF (@empty <= 0)
BREAK
ELSE
SET @Slot = @Slot+1
END
INSERT INTO PS_Billing.dbo.Users_Product (UserUID, Slot, ItemID, ItemCount, ProductCode, OrderNumber, BuyDate)
VALUES (@UserUID, @Slot, @ItemID, @ItemCount, @ProductCode, @OrderNumber, @BuyDate)
PRINT ''
IF @Slot < 239
PRINT 'Used slot: '+CONVERT(varchar(3), @Slot)
IF @Slot = 239
PRINT 'THERE IS NO FREE SLOT ANYMORE (240/240 SLOTS USED)!'
因此,我正在尝试做的是一个查询,将列出的项目发送给我数据库中的所有玩家,而不仅仅是一个玩家。
我会回答你的第一个问题。
SET @UserUID = (SELECT UserUID
FROM PS_UserData.dbo.Users_Master
WHERE UserID <> @UserID)
右侧的查询几乎可以保证返回多个值。
您只能为标量变量分配单个值,例如 @UserUID
。
请使用这种方式。
SELECT TOP 1 @UserUID = UserUID
FROM PS_UserData.dbo.Users_Master
WHERE UserID <> @UserID
正如其他人所提到的,您正在设置@userId
,它期望单个值到几乎总是有可能返回多个的结构。那根本行不通。
话虽如此,您应该尽量避免声明性语言的命令式编程风格。我的意思是,你几乎总是可以使用while
,而是使用joins
来获得结果,这是语言的风格,而且总是更快。