1

我在 sql 编码方面很新,我无法在互联网上找到解决方案,这是我的代码:

CREATE PROCEDURE GET_SAMEDATE (@FileName VARCHAR(50))
AS
    /* SET NOCOUNT ON */
    SELECT Hash
    FROM   Beamer.PackageDetailFile A(NOLOCK)
           INNER JOIN(SELECT FileName,
                             MAX(Date) MaxDate
                      FROM   Beamer.PackageDetailFile(NOLOCK)
                      GROUP  BY FileName)B
             ON B.FileName = A.FileName
                AND A.Date = B.MaxDate
    WHERE  FileName = @FileName 

我想要做的是将文件名与我从 ac# 类获得的文件名进行比较

而且我也得到“不明确的列名'FileName'”

*模棱两可的列名已解决,但我仍然无法从其他类获取 FileName 来比较它们是否具有相同的文件名

c#代码

SqlConnection myConnection = new SqlConnection(myConnectionString);

 SqlCommand myCommand = new SqlCommand("dbo.GET_SAMEDATE", myConnection );
 myCommand.CommandType = CommandType.StoredProcedure;
 try
 {
    myConnection.Open();
    SqlDataReader sdr = myCommand.ExecuteReader();

    while (sdr.Read())       
    {                   
        string h = (string)sdr.GetString(0);                     

        if (hash != h)
        {
           exists = true;
        }

       sdr.Read();
    }
4

3 回答 3

1

您需要在WHERE子句中指定表前缀。GROUP BY无论如何,您不需要在子查询上加入。它可以做得更简单。

CREATE PROCEDURE GET_SAMEDATE (@FileName VARCHAR(50))
AS
    SET NOCOUNT ON;

    SELECT TOP 1 WITH TIES Hash
    FROM   Beamer.PackageDetailFile
    WHERE  FileName = @FileName
    ORDER  BY Date DESC 
于 2012-07-11T10:31:44.193 回答
1

在您的WHERE子句中,您应该指定FileName来自 A 或 B 的表:

WHERE  FileName = @FileName 

所以要么:

WHERE  A.FileName = @FileName 

或者

WHERE  B.FileName = @FileName 
于 2012-07-11T10:32:07.097 回答
0

您需要在执行存储过程之前指定参数值。

myCommand.Parameters.AddWithValue("@FileName", hash)

您还可以按照 Martin Smith 在他的回答中建议的那样简化您的存储过程。

您尚未包含所有代码,但请确保您处置了 sqlConnection、sqlDataReader 和 sqlCommand 对象。您可以使用“Using”语句来完成此操作。

于 2012-07-11T14:25:17.593 回答