我正在尝试使用if语句创建sql server过程。 我是ms sql server的新用户但是我尝试了以下语句,但它给了我以下错误消息116,级别16,状态1,过程te,第9行 当子查询未与EXISTS一起引入时,只能在选择列表中指定一个表达式。
这是我写的代码
CREATE PROCEDURE test as
BEGIN
SET NOCOUNT ON;
if (select COUNT(load),load,contractor_id from [test].[dbo].[cont]
group by load,contractor_id
having load = (select MIN(load)from [test].[dbo].[cont])
) > 1
begin
SELECT top 1 COUNT(*),load ,contractor_id,name
FROM [test].[dbo].[cont]
group by load,contractor_id,name
having load = (select MIN(load)from [test].[dbo].[cont])
ORDER BY NEWID()
end
ELSE
BEGIN
SELECT top 1 COUNT(*),load ,contractor_id,name
FROM [test].[dbo].[cont]
group by load,contractor_id,name
having load = (select MIN(load)from [test].[dbo].[cont])
END
END
GO
任何人都可以帮忙吗
答案 0 :(得分:0)
如错误所示,使用IF条件时不能选择多列。在第一个IF条件中,您选择多个列,但是如果条件需要具有可导致一个值的查询。其他选择是您必须使用IF EXISTS,可以检查> 1,如下所示
IF (SELECT COUNT(load),load,contractor_id
FROM [test].[dbo].[cont]
GROUP BY load,contractor_id
HAVING load = (SELECT MIN(load)
FROM [test].[dbo].[cont])
AND COUNT(load) >1)
我注意到的另一件事是你正在执行多次计算加载最小值的查询。您可以通过将其存储在变量中并进一步使用它来避免这种情况。
我修改了以下程序。检查这是否有效。
CREATE PROCEDURE test as
BEGIN
SET NOCOUNT ON;
DECLARE @count INT
DECLARE @minload INT
SELECT @minload = MIN(load)from [test].[dbo].[cont]
SELECT @count = COUNT(load) from [test].[dbo].[cont]
GROUP BY load,contractor_id
HAVING load = @minload
IF (@count) > 1
BEGIN
SELECT top 1 COUNT(*),load ,contractor_id,name
FROM [test].[dbo].[cont]
WHERE load = @minload
GROUP BY load,contractor_id,name
ORDER BY NEWID()
END
ELSE
BEGIN
SELECT top 1 COUNT(*),load ,contractor_id,name
FROM [test].[dbo].[cont]
GROUP BY load,contractor_id,name
HAVING load = @minload
END
END
<强>更新强>
根据您的评论,我想您可以通过以下简单查询获得结果。
;WITH minLoad(load)
AS
(
SELECT MIN(load)
FROM [test].[dbo].[cont]
)
SELECT TOP 1 COUNT(*),c.load ,c.contractor_id,c.name
FROM [test].[dbo].[cont] c, minLoad
WHERE c.load = minLoad.load
ORDER BY NEWID();