将Rowset变量转换为标量值

时间:2016-10-17 20:17:44

标签: u-sql

是否可以将行集变量转换为标量值,例如。

class Petition(models.Model):
  # Added on creation
  target = models.CharField(max_length=50, null=True)
  title = models.CharField(max_length=300)
  body = models.TextField()
  goal = models.IntegerField()

  # Added after form creation
  letter = models.TextField(null=True)
  published = models.BooleanField(default=False)
  featured_image = models.CharField(max_length=250, null=True)
  end_date = models.DateTimeField(null=True)

  # Not User Submitted
  is_victory = models.BooleanField(default=False)
  created_at = models.DateTimeField(auto_now=False, auto_now_add=True)
  updated_at = models.DateTimeField(auto_now=True, auto_now_add=False)

  def __unicode__(self):
      return self.title

  def get_absolute_url(self):
    return reverse("petitions:detail", kwargs={"id": self.id})

2 个答案:

答案 0 :(得分:3)

在U-SQL中尚未将单单元行集隐式转换为标量值。

您对使用该值感兴趣的是什么?

大多数情况下,您可以以不需要标量变量的方式编写U-SQL表达式。例如,如果要在另一个查询的条件中使用该值,则可以在与另一个查询的连接中使用单值rowset(并且使用正确的统计信息,我很确定优化器会将其转换为广播加入)。

如果您觉得无法轻松地将没有行集的表达式写入标量,请通过提供您的方案通过http://aka.ms/adlfeedback告诉我们。

答案 1 :(得分:1)

感谢您提供意见,以下是业务案例 -

我们有源自我们需要生成唯一ID的源的目录数据。使用ROW_NUMBER() OVER() AS Id方法,我们可以生成唯一ID。但是在合并新记录时,它也会改变现有记录的ID并导致关系数据出现问题

以下是简单的解决方案

//get max id from existing catalog

@maxId =
    SELECT (int)MAX(Id) AS lastId
    FROM @ExistingCat;

//because @maxId is not scalar, we will do CROSS JOIN so that maxId is repeated for every record.
//ROW_NUMBER() always starts from 1, we can generate next Id with maxId+ROW_NUMBER()

@newRecordsWithId =
    SELECT (int)lastId + (int)ROW_NUMBER() OVER() AS Id,
           CatalogItemName
    FROM @newRecords CROSS JOIN @maxId;