我正在编写一个应用程序,我在C#中生成一个随机订单号,在我执行insert语句之前,我需要验证没有重复的订单号。这是我的存储过程(这只是一个帮助解决这个问题的测试程序)
CREATE PROCEDURE Test$For$Dupes
(@RandNum int)
AS
declare @myNum int
SELECT OrderNumber, COUNT(*)
FROM [TEST]
WHERE OrderNumber = @RandNum
IF(COUNT(*) < 1)
SET @myNum = 0
IF(COUNT(*) > 1)
SET @myNum = 1
我想要完成的是,如果有重复我需要输出1并让我的c#代码重新生成一个随机数,如果没有重复,那么我需要输出0所以我可以继续我的插入我的表格。
几年前我弄清楚这个问题并且无法找到我的代码,现在我很想弄明白。有什么想法吗?它还没有工作,我收到了这个错误:
消息8120,等级16,状态1,程序测试$对于$ Dupes,第8行 列'TEST.OrderNumber'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中
答案 0 :(得分:1)
这样效率会更高一些,因为它会在找到匹配时停止查看表格。而且我认为它更清楚。
CREATE PROCEDURE Test$For$Dupes
(
@RandNum int
)
AS
BEGIN
IF EXISTS (SELECT 1 FROM [TEST] WHERE OrderNumber = @RandNum)
SELECT 1
ELSE
SELECT 0
END
您可以在C#端读取此内容,如:
using (SqlConnection cnn = new SqlConnection(ConnectionString))
{
SqlCommand cmd = cnn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Test$For$Dupes";
cmd.Parameters.AddWithValue("@RandNum", 100);
return (int) cmd.ExecuteScalar()
}
答案 1 :(得分:0)
在您的代码中,您尝试将条件作为Count(*)
进行比较,而不是变量。
您需要声明一个变量并在查询中设置该变量,然后在if
条件下比较该变量。所以,如果我纠正你的代码,那将是:
CREATE PROCEDURE Test$For$Dupes
(
@RandNum int
)
AS
Begin
declare @myNum int
declare @orderNoCount int
select @orderNoCount=COUNT(*) FROM [TEST]
WHERE OrderNumber = @RandNum
IF(@orderNoCount =< 1)
Set @myNum = 0
IF(@orderNoCount > 1)
SET @myNum = 1
END
在您的代码中,您缺少条件
when ordernumber = 1
...所以我也添加了这个条件。
你也可以试试这个:
CREATE PROCEDURE Test$For$Dupes
(
@RandNum int
)
AS
BEGIN
IF (select Count(Distinct OrderNumber) FROM [TEST] WHERE OrderNumber = @RandNum) >= 1
Set @myNum = 1
ELSE
SET @myNum = 0
END
答案 2 :(得分:0)
您甚至不需要if..else
条件,只需使用以下代码:
CREATE PROCEDURE Test$For$Dupes
(
@RandNum int
)
AS
BEGIN
declare @myNum int
SELECT @myNum = CASE COUNT(*)
WHEN 0 THEN 0
ELSE 1
END
FROM test
WHERE orderNumber = @RandNum
GROUP BY orderNumber
END