有人可以看看我的存储过程并告诉我哪里出错了吗?

时间:2013-08-31 17:54:42

标签: sql sql-server

我正在编写一个应用程序,我在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子句中

3 个答案:

答案 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

小提琴:http://sqlfiddle.com/#!3/51a0e/22