Ошибка SQL CLR или ошибка? - PullRequest
       10

Ошибка SQL CLR или ошибка?

2 голосов
/ 30 ноября 2010

Я запускаю некоторый код C # внутри функции CLR и сталкиваюсь со странным поведением.

Когда выполняется следующий код:

  SqlCommand cmd = new SqlCommand();
  cmd.CommandText = "SELECT * FROM Vertica_GetVerticaServer_vw WHERE verticaServer IS NOT NULL ORDER BY NEWID()";

  using (cmd.Connection = GetSQLConnection())
  {
    cmd.Connection.Open();
    SqlDataReader r = cmd.ExecuteReader();

    while (r.Read())
    {
      return r.GetString(0);
    }
  }

Выдается эта ошибка (полная соответствующая трассировка стека ниже):

Операторы выбора, включенные в функцию, не могут возвращать данные вclient.

Однако, когда я запускаю тот же код, за исключением «ORDER BY NEWID ()» (используется для рандомизации результата) и вместо этого запускаю «ORDER BY NEWID ()» внутри представления, яне получите ошибок: кто-нибудь знает, что здесь происходит?

  SqlCommand cmd = new SqlCommand();
  cmd.CommandText = "SELECT * FROM Vertica_GetVerticaServer_vw WHERE verticaServer IS NOT NULL");// ORDER BY NEWID()";

  using (cmd.Connection = GetSQLConnection())
  {
    cmd.Connection.Open();
    SqlDataReader r = cmd.ExecuteReader();

    while (r.Read())
    {
      return r.GetString(0);
    }
  }
  throw new Exception("Could not get Vertica Server name");

Похоже, ошибка, но, может быть, я что-то упускаю из NEWID ()?

(Обратите внимание, я тестировал сВместо этого GETDATE (), чтобы увидеть, была ли это проблема с детерминизмом, и это также сработало ...).

Полный след стека:

---> System.Data.SqlClient.SqlException: Операторы выбора, включенные в функцию, не могут возвращать данные клиенту.System.Data.SqlClient.SqlException: в System.Data.SqlClient.SqlConnection.OnError (SqlException исключением, булева breakConnection) в System.Data.SqlClient.SqlDataReaderSmi.InternalNextResult (Boolean ignoreNonFatalMessages) при System.Data.SqlClient.SqlDataReaderSmi.NextResult () в System.Data.SqlClient.SqlCommand.RunExecuteReaderSmi (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream) в System.Data.SqlClient.SqlCommand.RunExecuteReader (метод RunBehBehBehBor)Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, метод String) в System.Data.SqlClient.SqlCommand.ExecuteReader (метод CommandBehavl.Aggregation.AggregateDataManager.GetVerticaServer ()

В соответствии с запросом, вот настройка TVR CLR:

        [Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "FillRowAggregates", TableDefinition = "listId int, pricingDate datetime, value decimal", DataAccess=DataAccessKind.Read)]
    public static IEnumerable CalculateListAggregatePricing(int listId, DateTime start, DateTime end, int WeightTypeId)
    {
        DataRequest d = new DataRequest();
        d.Start = start;
        d.Finish = end;
        d.Metric = Metric.GetSharePricingMetric();
        d.Metric.Weight = WeightType.Equal;
        _listId = listId; 
        List<ConstituentInfo> ci = new List<ConstituentInfo>();
        foreach (int i in AggregateDataManager.GetConstituents(listId))
            ci.Add(new ConstituentInfo(i, end));

        switch (WeightTypeId)
        {
            case 0:
                EqualWeightInterpreterForSQLCLR e = new EqualWeightInterpreterForSQLCLR();
                return e.GetIndex(d, ci, false);
            case 1:
                MarketCapWeightInterpreterForSQLCLR mc = new MarketCapWeightInterpreterForSQLCLR();
                return mc.GetIndex(d, ci, false);
            case 2:
                PriceWeightInterpreterForSQLCLR p = new PriceWeightInterpreterForSQLCLR();
                return p.GetIndex(d, ci, false);
        }
        throw new Exception("Invalid Weight Type");

    }

    public static void FillRowAggregates(Object o, out SqlInt32 listId, out SqlDateTime pricingDate, out SqlDecimal value)
    {
        DataPoint dp = (DataPoint)o;

        listId = _listId;
        pricingDate = dp.PricingDate;
        value = (SqlDecimal)dp.Value;
    }

ThСоединение создается WeightedInterpreters.

1 Ответ

0 голосов
/ 02 февраля 2011

Вы пробовали что-то вроде TOP 99.99999 PERCENT?

...