У меня есть таблица под названием ReportValues, которая хранит всю информацию о игроке в парах ключей и значений В таблице есть внешний ключ из другой таблицы, называемой Reports. Я пытаюсь получить все данные в одной строке для каждого отчета, где ключи будут именами столбцов, а значения заполнят возвращенную таблицу. Если я вставляю @pID вручную, а не как параметр, то код работает, но при использовании параметра я получаю следующую ошибку: «Должен объявить скалярную переменную« @pID ». Вот мой код:Попытка передать параметры из asp.net при использовании инструкции DECLARE, но получить сообщение об ошибке «Должен объявить скалярную переменную» @pID »
public DataTable getBarChartData(int p_ID)
{
//this query is transposing rows into columns as each key gets a column and the grouping variable is RV.report
string sqlQuery = "DECLARE @keyName AS VARCHAR(MAX) ";
sqlQuery += "SELECT @keyName = ";
sqlQuery += "COALESCE(@keyName + ', ', '') + CAST(keyName AS VARCHAR(20)) ";
sqlQuery += "FROM(SELECT DISTINCT keyname FROM ReportValues) ActivePlayers ";
sqlQuery += "SELECT @keyName keyNames ";
sqlQuery += "DECLARE @DynamicPIVOT AS VARCHAR(MAX) ";
sqlQuery += "SELECT @DynamicPIVOT = 'SELECT ' + @keyName + ";
sqlQuery += "' FROM (";
sqlQuery += "SELECT RV.report, RV.keyname, RV.value FROM ReportValues RV ";
sqlQuery += "join ReportValues RV1 on RV.report = RV1.report ";
sqlQuery += "join ReportValues RV2 on RV.report = RV2.report ";
sqlQuery += "where RV1.value <> 1 and RV1.keyName = ''SessionStage'' and RV2.value = @pID and RV2.keyName = ''PId'' and RV.report in (";
sqlQuery += "SELECT id FROM Reports r ";
sqlQuery += "WHERE r.timeStamp >= dateadd(hour, -240, GETDATE()) ";
sqlQuery += ") ";
sqlQuery += ") ActivePlayers";
sqlQuery += "PIVOT(";
sqlQuery += "MAX(value) FOR keyname IN(' + @keyName + ') ";
sqlQuery += ") Result; ' ";
sqlQuery += "EXEC(@DynamicPIVOT) ";
int pID = p_ID;
//this passes the query and param to an execution function
DataTable dtLabels = GetBarChartDataByUser(sqlQuery, pID);
return dtLabels;
}
//this is the sql execution function
public DataTable GetBarChartDataByUser(string strQuery, int pID)
{
SqlConnection con = new SqlConnection(createConnectionReadOnly());
con.Open();
try
{
SqlCommand cmd = con.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = strQuery;
cmd.Parameters.AddWithValue("@pID", pID);
SqlDataAdapter dap = new SqlDataAdapter(cmd);
//here is where I get the error
DataSet ds = new DataSet();
dap.Fill(ds);
return ds.Tables[0];
}
catch (Exception ex)
{
}
finally
{
if (con.State == ConnectionState.Open)
{
con.Close();
}
}
return null;
}
Я не думаю, что вы можете передавать переменные в exec таким образом. Вы должны попробовать sp_executesql вместо –
Эта проблема не имеет ничего общего с sp_executesql – Alex