我可以在T-SQL SELECT中定义循环变量(如LINQ中的LET)吗?

Use*_*ser 11 sql t-sql sql-server

我可以用LINQ写这样的东西:

var selection = from person in personList
                let initials = person.FirstName[0] + person.LastName[0]
                select initials;
Run Code Online (Sandbox Code Playgroud)

我可以用SQL做类似的事情,比如:

SELECT @Initials
FROM [Person]
SET @Initials = SUBSTRING (Person.FirstName, 1, 1) + SUBSTRING (Person.LastName, 1, 1)
Run Code Online (Sandbox Code Playgroud)

可能不是,但也许有一个伎俩?

我需要有一个预先计算的变量,以便在复杂的WHERE子句中进一步使用,以避免极端复杂性和代码重复.

ric*_*ent 13

在不添加临时表,循环等的情况下执行此操作的干净方法将使用公用表表达式(CTE).例:

;WITH PersonsWithInitials AS
(
    SELECT
        SUBSTRING (COALESCE(Person.FirstName,''), 1, 1)
        + SUBSTRING (COALESCE(Person.LastName,''), 1, 1) AS Initials,            
        FirstName,
        LastName,
        City
    FROM
        [Person]
)
SELECT
    FirstName,
    LastName,
    City,
    Initials
FROM
    PersonsWithInitials
WHERE
    /* Complex WHERE clause goes here and it can reference Initials as if it were a field */
Run Code Online (Sandbox Code Playgroud)

代替上面的空"",您可以使用句号或其他内容代替空名称字段.

这应该都是在.NET的单个SQL调用中执行的 - CTE不会像视图,存储过程,临时表等一样保存在数据库中.

  • OP说:"我需要有一个预先计算的变量,以便在复杂的WHERE子句中进一步使用".从他们的问题来看,看起来他们想要将结果存储在变量中,而不仅仅是返回一次结果集.如果没有,那么这是一个很好的答案,否则他们需要检查我的答案...... (2认同)
  • -1如果我理解他,这不是op所要求的. (2认同)