【问题标题】:sql server procedure is not returning datasql server 过程不返回数据
【发布时间】:2013-02-11 22:44:23
【问题描述】:

我的 Sql 程序运行良好。但是当我从 Class 调用它时,它不会返回数据。我得到了这个错误。 Column 'Territory_Name' does not belong to table .我调试了代码,发现所有参数都正确传递了,但是程序没有返回任何数据。如果有人有想法,请帮助我。

我的存储过程是:

ALTER PROCEDURE dbo.SPFilterCRMRequests
(
    /* for Time Span */
    @WeekList varchar(50) = null,
    @MonthList varchar(50) = null,
    @YearList varchar(50) = null,
    @QuaterList varchar(50) = null,
    /* for other specific criteria */
    @PriorityList varchar(50) = null,
    @Division_IdList varchar(50) = null,
    @CRM_Service_Type_IdList varchar(50) = null,
    @CRM_Notation_IdList varchar(50) = null,
    @CRM_State_IdList varchar(50) = null,
    @Service_State_IdList varchar(50) = null,
    @Estimated_Amount float

    /* for Designation 
    @Requester varchar(20),
    @Suggester varchar(20) */
)
AS
    SET NOCOUNT ON 
    /*Declare @date3 DateTime = CONVERT(date,'2/8/2013 5:17:00 PM')*/
    DECLARE @sql nvarchar(4000)

    SELECT @sql='SELECT
    CRMDR.Id as Id,  
    LEFT(GEOTREE.GEONAME,15) as Territory_Name,  
    CRMDR.Request_For_Id as Request_For_Id, 
    DRMST.DRNAME as Request_For_Name, 
    USERSTBM.USERNAME as Requester_Name,
    Division.Div_Name as Division_Name,
    USERSABM.USERNAME as Suggester_Name,
    CRMDR.Estimated_Amount as Estimated_Amount, 
    CRMDR.Actual_Amount as Actual_Amount, 
    CRMDR.Compute_Priority as Compute_Priority, 
    CRMNotation.Notation_Name as CRM_Notation_Name,
    CRMServiceType.ServiceName as CRM_Service_Type_Name, 
    CRMDR.Deadline as Deadline, 
    CRMDR.Executed_Date as Executed_Date, 
    CRMDR.Date_Created as Date_Created, 
    CRMDR.Compute_CRM_State as Compute_CRM_State, 
    CRMDR.Compute_Service_State as Compute_Service_State

    From [CRM].[dbo].[CRM_Doctor_Request] AS CRMDR

    JOIN [ASES].[dbo].[USERS] AS USERSTBM
    ON CRMDR.Requester COLLATE SQL_Latin1_General_CP1_CI_AS = USERSTBM.RID COLLATE SQL_Latin1_General_CP1_CI_AS

    JOIN [ASES].[dbo].[USERS] AS USERSABM
    ON CRMDR.Suggester COLLATE SQL_Latin1_General_CP1_CI_AS = USERSABM.RID COLLATE SQL_Latin1_General_CP1_CI_AS

    JOIN [ASES].[dbo].[GEOTREE] AS GEOTREE
    ON CRMDR.Territory COLLATE SQL_Latin1_General_CP1_CI_AS = GEOTREE.RID COLLATE SQL_Latin1_General_CP1_CI_AS

    JOIN [ASES].[dbo].[DRMST] AS DRMST
    ON CRMDR.Request_For_Id COLLATE SQL_Latin1_General_CP1_CI_AS = DRMST.MDLNO COLLATE SQL_Latin1_General_CP1_CI_AS

    JOIN [CRM].[dbo].[CRM_Request_For_Type] AS CRMReqForType
    ON CRMDR.CRM_Request_For_Type_Id  = CRMReqForType.Id 

    JOIN [CRM].[dbo].[CRM_Notation] AS CRMNotation
    ON CRMDR.CRM_Notation_Id  = CRMNotation.Id 

    JOIN [CRM].[dbo].[CRM_Service_Type] AS CRMServiceType
    ON CRMDR.CRM_Service_Type_Id  = CRMServiceType.Id 

    JOIN [CRM].[dbo].[Division] AS Division
    ON CRMDR.Division_Id  = Division.Id 

    WHERE CRMDR.Is_Deleted=0 '
    If (@MonthList) IS NOT NULL
        SELECT @sql=@sql + ' AND MONTH(CRMDR.Date_Created) in (' + @MonthList + ')  '
    If (@YearList) IS NOT NULL
        SELECT @sql=@sql + ' AND (CRMDR.Date_Created) in (' + @YearList + ') '
    If (@WeekList) IS NOT NULL
BEGIN
    DECLARE @DateCondition varchar(1000)
    DECLARE @ColumnName varchar(50) = 'CRMDR.Date_Created' 
    -- pass the columnname on which condition needs to be aaplied
    EXEC dbo.SPWhereconditionForMultipleWeeks  @WeekList, @ColumnName, @DateCondition OUTPUT
    SELECT @DateCondition
    -- if (LEN(@DateCondition) > 0 )
        SELECT @sql=@sql + ' AND '+ SUBSTRING(@DateCondition, 1, LEN(@DateCondition)-3)
END
If (@QuaterList) IS NOT NULL
BEGIN
    DECLARE @MonthsList varchar(1000)
    EXEC dbo.SPGetMonthsListforMultipleQuaters  @QuaterList, @MonthsList OUTPUT
    SELECT @MonthsList
    -- print @MonthsList
    -- if (LEN(@MonthsList) > 0 )
    SELECT @sql=@sql + ' AND MONTH(CRMDR.Date_Created) in ('
    + SUBSTRING(@MonthsList, 1, LEN(@MonthsList)-1) +')'
END
    If (@PriorityList) IS NOT NULL
        SELECT @sql=@sql + ' AND Priority in (' + @PriorityList + ') '
    If (@Division_IdList) IS NOT NULL
        SELECT @sql=@sql + ' AND Division_Id in (' + @Division_IdList + ') '
    If (@CRM_Service_Type_IdList) IS NOT NULL
        SELECT @sql=@sql + ' AND CRM_Service_Type_Id in (' + @CRM_Service_Type_IdList + ') '
    If (@CRM_Notation_IdList) IS NOT NULL
        SELECT @sql=@sql + ' AND CRM_Notation_Id in (' + @CRM_Notation_IdList + ') '
    If (@Estimated_Amount) IS NOT NULL
        SELECT @sql=@sql + ' AND Estimated_Amount > (@Estimated_Amount) '
    If (@CRM_State_IdList) IS NOT NULL
        SELECT @sql=@sql + ' AND CRM_State_Id in (' + @CRM_State_IdList + ') '
    If (@Service_State_IdList) IS NOT NULL
        SELECT @sql=@sql + ' AND Service_State_Id in (' + @Service_State_IdList + ') '

    SELECT @sql=@sql + ' ORDER BY CRMDR.Id DESC '
    --print @sql

    EXEC sp_executesql @sql, N' @MonthList varchar(50), 
    @YearList varchar(50), 
    @QuaterList varchar(50),  
    @PriorityList varchar(50), 
    @Division_IdList varchar(50), 
    @CRM_Service_Type_IdList varchar(50), 
    @CRM_Notation_IdList varchar(50), 
    @Estimated_Amount float, 
    @CRM_State_IdList varchar(50), 
    @Service_State_IdList varchar(50) ', 
         @MonthList, 
         @YearList, 
         @QuaterList, 
         @PriorityList, 
         @Division_IdList, 
         @CRM_Service_Type_IdList, 
         @CRM_Notation_IdList, 
         @Estimated_Amount, 
         @CRM_State_IdList, 
         @Service_State_IdList
RETURN

我的班级调用程序:

public static List<CRM_Doctor_Request> FilterCRM_Doctor_Request_Details(string WeekList, string MonthList, string YearList, string QuaterList, string PriorityList, string Division_IdList,  string CRM_Service_Type_IdList, string CRM_Notation_IdList, string CRM_State_IdList, string Service_State_IdList, float Estimated_Amount) 
        {
            string proc = "SPFilterCRMRequests";

            List<SqlParameter> arrParam = new List<SqlParameter>();
            SqlParameter pWeekList = new SqlParameter("@WeekList", SqlDbType.VarChar);
            SqlParameter pMonthList = new SqlParameter("@MonthList", SqlDbType.VarChar);
            SqlParameter pYearList = new SqlParameter("@YearList", SqlDbType.VarChar);
            SqlParameter pQuaterList = new SqlParameter("@QuaterList", SqlDbType.VarChar);
            SqlParameter pPriorityList = new SqlParameter("@PriorityList", SqlDbType.VarChar);
            SqlParameter pDivision_IdList = new SqlParameter("@Division_IdList", SqlDbType.VarChar);
            SqlParameter pCRM_Service_Type_IdList = new SqlParameter("@CRM_Service_Type_IdList", SqlDbType.VarChar);
            SqlParameter pCRM_Notation_IdList = new SqlParameter("@CRM_Notation_IdList", SqlDbType.VarChar);
            SqlParameter pCRM_State_IdList = new SqlParameter("@CRM_State_IdList", SqlDbType.VarChar);
            SqlParameter pService_State_IdList = new SqlParameter("@Service_State_IdList", SqlDbType.VarChar);
            SqlParameter pEstimated_Amount = new SqlParameter("@Estimated_Amount", SqlDbType.Float);

            pWeekList.Value = WeekList;
            pMonthList.Value = MonthList;
            pYearList.Value = YearList;
            pQuaterList.Value = QuaterList;
            pPriorityList.Value = PriorityList;
            pDivision_IdList.Value = Division_IdList;
            pCRM_Service_Type_IdList.Value = CRM_Service_Type_IdList;
            pCRM_Notation_IdList.Value = CRM_Notation_IdList;
            pCRM_State_IdList.Value = CRM_State_IdList;
            pService_State_IdList.Value = Service_State_IdList;
            pEstimated_Amount.Value = Estimated_Amount;

            arrParam.Add(pWeekList);
            arrParam.Add(pMonthList);
            arrParam.Add(pYearList);
            arrParam.Add(pQuaterList);
            arrParam.Add(pPriorityList);
            arrParam.Add(pDivision_IdList);
            arrParam.Add(pCRM_Service_Type_IdList);
            arrParam.Add(pCRM_Notation_IdList);
            arrParam.Add(pCRM_State_IdList);
            arrParam.Add(pService_State_IdList);
            arrParam.Add(pEstimated_Amount);

            DataTable table = DataProvider.SelectStoreProcedure(proc, arrParam);

            List<CRM_Doctor_Request> ListCRM_Doctor_Request = new List<CRM_Doctor_Request>();

            foreach (DataRow row in table.Rows)
            {
                CRM_Doctor_Request CRM_Doctor_RequestObj = new CRM_Doctor_Request();

                CRM_Doctor_RequestObj.Territory_Name = Convert.ToString(row["Territory_Name"]);
                CRM_Doctor_RequestObj.Request_For_Id = Convert.ToString(row["Request_For_Id"]);
                CRM_Doctor_RequestObj.Request_For_Name = Convert.ToString(row["Request_For_Name"]);
                CRM_Doctor_RequestObj.Requester_Name = Convert.ToString(row["Requester_Name"]);
                CRM_Doctor_RequestObj.Division_Name = Convert.ToString(row["Division_Name"]);
                CRM_Doctor_RequestObj.Suggester_Name = Convert.ToString(row["Suggester_Name"]);
                CRM_Doctor_RequestObj.Id = Convert.ToInt32(row["Id"]);    
                CRM_Doctor_RequestObj.Compute_Priority = Convert.ToString(row["Compute_Priority"]);
                CRM_Doctor_RequestObj.CRM_Notation_Name = Convert.ToString(row["CRM_Notation_Name"]);
                CRM_Doctor_RequestObj.CRM_Service_Type_Name = Convert.ToString(row["CRM_Service_Type_Name"]);                    
                CRM_Doctor_RequestObj.Compute_CRM_State = Convert.ToString(row["Compute_CRM_State"]);
                CRM_Doctor_RequestObj.Compute_Service_State = Convert.ToString(row["Compute_Service_State"]);

                ListCRM_Doctor_Request.Add(CRM_Doctor_RequestObj);
            }
            return ListCRM_Doctor_Request;
        }

DataProvider.SelectStoreProcedure 的代码:

class DataProvider
    {
        public static string connectionString = ConfigurationManager.ConnectionStrings["connect_str"].ConnectionString;

        public static DataTable SelectStoreProcedure(string ProcName, List<SqlParameter> ParaArr)
        {
                DataTable data = new DataTable();
                SqlConnection cn = new SqlConnection(connectionString);
                cn.Open();
                SqlCommand cmd = new SqlCommand(ProcName, cn);
                foreach (SqlParameter para in ParaArr)
                {
                    cmd.Parameters.Add(para);
                }
                cmd.CommandType = CommandType.StoredProcedure;

                SqlDataAdapter da = new SqlDataAdapter(cmd);

                da.Fill(data);
                cn.Close();
                return data;
        }
    }

【问题讨论】:

  • 我看不出您的代码有什么问题,尽管您进入 foreach 循环的事实表明正在返回一些行。您可能想要检查分析器以确切了解传递给服务器的内容,然后运行它并查看结果。这可能与调用错误的 SP 一样微不足道,因为架构未在您的 SqlCommand 中定义(例如,调用 MyUserName.SPFilterCRMRequests 而不是 dbo.SPFilterCRMRequests
  • 我发现SPFilterCRMRequests返回DataTable中子过程SPWhereconditionForMultipleWeeks返回的值。
  • 在这种情况下,您需要填写DataSet,DataSet 中的最后一个表将包含您要查找的数据。

标签: sql sql-server-2008 function stored-procedures


【解决方案1】:

这看起来很乱;由于您正在执行多个查询,我认为您需要将数据填充到 DataSettake the 0th Table 或使用正确查询的结果填充 Datatable。

您还可以使用Parameters.AddWithValue() 将代码减少一半,并将using 与连接对象一起使用。

//Your method
DataSet data = new DataSet(); //Note Dataset here ****
string connectionString = ConfigurationManager.ConnectionStrings["connect_str"].ConnectionString;

using(SqlConnection cn = new SqlConnection(connectionString))
{
    string proc = "SPFilterCRMRequests";
    SqlCommand cmd = new SqlCommand(proc, cn);
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.AddWithValue("@WeekList", WeekList);
    cmd.Parameters.AddWithValue("@MonthList", pMonthList);
    cmd.Parameters.AddWithValue("@YearList", pYearList);
    cmd.Parameters.AddWithValue("@QuaterList", pQuaterList);
    cmd.Parameters.AddWithValue("@PriorityList", pPriorityList);
    cmd.Parameters.AddWithValue("@Division_IdList", pDivision_IdList);
    cmd.Parameters.AddWithValue("@CRM_Service_Type_IdList", pCRM_Service_Type_IdList);
    cmd.Parameters.AddWithValue("@CRM_Notation_IdList", pCRM_Notation_IdList);
    cmd.Parameters.AddWithValue("@CRM_State_IdList", pCRM_State_IdList);
    cmd.Parameters.AddWithValue("@Service_State_IdList", pService_State_IdList);
    cmd.Parameters.AddWithValue("@Estimated_Amount", pEstimated_Amount);


    SqlDataAdapter da = new SqlDataAdapter(cmd);
    cn.Open();
    da.Fill(data);
}

List<CRM_Doctor_Request> ListCRM_Doctor_Request = 
                         new List<CRM_Doctor_Request>();

foreach (DataRow row in data.Tables[0].Rows) //**** Note 0th table here ******
{
 //rest of the code
}
//...

【讨论】:

    【解决方案2】:

    您的问题是您正在尝试填充表(未定义架构)

    DataTable data = new DataTable(); 更改为DataSet data = new DataSet();

    DataTable table = dataDataTable table = data.Tables[0]

    您的架构将自动生成,一切正常。

    **编辑**

    尝试从此设置构建您的查询...

    定义这个存储过程

    CREATE PROCEDURE [dbo].[TestProc1] 
    AS
    BEGIN
        SET NOCOUNT ON;
    
        DECLARE @sql NVARCHAR(MAX) = 'SELECT 1 x UNION ALL SELECT 2'
    
        EXEC sp_executesql @sql
    END
    

    创建一个仅包含此代码的测试应用

    class Program
    {
        public const string ConnectionString = @"???";
    
        static void Main(string[] args)
        {
            var t = Execute("TestProc1");
    
            Trace.Assert(t.Rows.Count == 2);
        }
    
        private static DataTable Execute(string sql)
        {
            using (var connection = new SqlConnection(ConnectionString))
            {
                connection.Open();
    
                using (var command = new SqlCommand(sql, connection))
                {
                    command.CommandType = CommandType.StoredProcedure;
                    var da = new SqlDataAdapter(command);
    
                    var ds = new DataSet();
                    da.Fill(ds);
    
                    return ds.Tables[0];
                }
            }
        }
    }
    

    连接字符串是你的连接字符串。

    这将起作用,并且在功能上等同于您正在做的事情。一旦你有了这个工作,试着建立它来匹配你的具体情况

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2017-02-22
      相关资源
      最近更新 更多