C#SQL查询生成与Management Studio不同的结果

时间:2013-08-09 19:50:00

标签: c# sql ssms

SELECT  
   wl.WatchListId, wl.Code, wl.[Description], wl.DateCreated,
   wl.CreatedBy, wl.DateModified, wl.ModifiedBy,
   wpi.ParameterExpression as IndividualExpression,
   wpb.ParameterExpression as BusinessExpression,
   wpd.ParameterExpression as DefaultExpression,
   CASE 
       WHEN EXISTS(SELECT 1 FROM SourceWatchList 
                   WHERE SourceId = @SourceId AND WatchListId = wl.WatchListId)  
       THEN 1 ELSE 0 
   END AS IsActive
FROM 
   [WatchList] wl 
LEFT JOIN  
   SourceWatchList swl ON wl.WatchListId = swl.WatchListId AND swl.SourceId = @SourceId
LEFT JOIN 
   (SELECT 
        ParameterExpression, SourceId, WatchListId 
    FROM WatchListParameter 
    WHERE EntityType = 'INDIVIDUAL') wpi ON wpi.SourceId = @SourceId 
                                         AND wpi.WatchListId = wl.WatchListId
LEFT JOIN 
    (SELECT 
         ParameterExpression, SourceId, WatchListId 
     FROM WatchListParameter 
     WHERE EntityType = 'BUSINESS') wpb ON wpb.SourceId = @SourceId 
                                        AND wpb.WatchListId = wl.WatchListId
LEFT JOIN 
    (SELECT ParameterExpression, SourceId, WatchListId 
     FROM WatchListParameter 
     WHERE EntityType = 'DEFAULT') wpd ON wpd.SourceId = @SourceId 
                                       AND wpd.WatchListId = wl.WatchListId
WHERE 
     wl.IsActive = 1

我有上述查询。很简单。

以下是SQL Server Management Studio表的一个片段:

enter image description here

并从Visual Studio中的调试器:enter image description here

当Management Studio(正确)执行时,Visual Studio表在3个表达式列中没有数据。可以告诉我为什么会这样,以及我可以采取哪些步骤来解决这个问题?

我100%肯定我在两者之间也使用了相同的参数。

string sql = @"SELECT  wl.WatchListId,wl.Code,wl.[Description],wl.DateCreated,
                                wl.CreatedBy,wl.DateModified,wl.ModifiedBy,
                                wpi.ParameterExpression as IndividualExpression,
                                wpb.ParameterExpression as BusinessExpression,
                                wpd.ParameterExpression as DefaultExpression,
                                CASE WHEN EXISTS(Select 1 FROM SourceWatchList 
                                    WHERE SourceId = @SourceId AND WatchListId = wl.WatchListId)  
                                        THEN 1 ELSE 0 END AS IsActive
                        FROM [WatchList] wl 

                        LEFT JOIN  SourceWatchList swl on wl.WatchListId = swl.WatchListId and swl.SourceId = @SourceId
                        LEFT JOIN (Select ParameterExpression, SourceId, WatchListId FROM WatchListParameter WHERE EntityType = 'INDIVIDUAL') wpi
                                        ON wpi.SourceId = @SourceId AND wpi.WatchListId = wl.WatchListId
                        LEFT JOIN (Select ParameterExpression, SourceId, WatchListId FROM WatchListParameter WHERE EntityType = 'BUSINESS') wpb
                                        ON wpb.SourceId = @SourceId AND wpb.WatchListId = wl.WatchListId
                        LEFT JOIN (Select ParameterExpression, SourceId, WatchListId FROM WatchListParameter WHERE EntityType = 'DEFAULT') wpd
                                        ON wpd.SourceId = @SourceId AND wpd.WatchListId = wl.WatchListId
                        where wl.IsActive = 1";
        SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["WatchListCompliance"].ConnectionString);
        conn.Open();
        SqlCommand cmd = new SqlCommand(sql, conn);
        cmd.CommandText = sql;
        cmd.Parameters.AddWithValue("@SourceId", SourceId);

        DataTable dt = new DataTable();
        using (SqlDataAdapter a = new SqlDataAdapter(cmd))
        {
            a.Fill(dt);
        }

2 个答案:

答案 0 :(得分:0)

这可能是类型和相等的问题。在sqlcommand上定义参数时,可以尝试使用SqlDataType。如果在不声明类型的情况下使用addwithvalue,则可能选择了错误的类型。然后你应该使用你在sql表达式中声明的类型。

cmd.Parameters.Add("@SourceId", SqlDbType.VarChar, 20);
cmd.Parameters["@SourceId"].Value = SourceId;

答案 1 :(得分:0)

狂野猜测:您确定您的会话配置方式相同吗?特别是SET ANSI_NULLS选项,它更改了比较在空值方面的行为方式。

值得注意的是,某些数据库可能具有不寻常的默认值,但某些客户端(例如ADO.NET)在连接时会明确定义自己的会话值,即使您没有要求它们。